我对 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,
}
}
据我所知,我包含具有两个键值对的对象的泛型。但是,如果我尝试返回具有这些属性的对象,则类型不匹配。我很想知道为什么。
答案 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 会对它感到满意。