受约束的泛型返回值需要与参数相关

时间:2021-05-18 13:01:55

标签: typescript typescript-generics

我对 TypeScript 比较陌生,偶然发现了一个我很难理解的概念。 Example - Playground link

interface Base {
  one: number;
  two: number;
}

type ExampleFunction = <T extends Base>(args: T) => {[key in keyof T]: T[key]};

const exampleFunction: ExampleFunction = (arg) => {
  return { <-- this object throws an error
    one: arg.one,
    two: arg.two,
  }
}

据我所知,我包含具有两个键值对的对象的泛型。但是,如果我尝试返回具有这些属性的对象,则类型不匹配。我很想知道为什么。

1 个答案:

答案 0 :(得分:1)

当类型 T 扩展您的接口时,这意味着它可能会向基类型添加更多属性,或者缩小其现有属性。以下是符合 extends Base 条件的接口示例:

type T1 = {one: number; two: number; three: number};
type T2 = {one: 1; two: 2};

如果您将 exampleFunction 应用于 arg 类型的 T1,它不会返回您声明的类型的对象:属性 three 将丢失。对于这种特殊情况,您可能正在寻找像 return {...arg} 这样的结构——它将保留所有属性,因此 Typescript 会对它感到满意。

相关问题