Typescript 在 Pick 实现中扩展
Typescript extends in Pick implementation
这是来自 this tuturial
的 Typescript Pick
实用程序类型的基本实现
type ObjectWithKeys<T, K extends keyof T> = {
[P in K]: T[P];
};
我不明白它的作用,但我发现 K extends keyof T
的使用有点令人困惑。我们要确保 K 是联合类型 keyof T
的成员(或成员的联合)。它永远不会“扩展”它,所以为什么要在这里使用 extends
运算符?
Typescript 是否缺少运算符,这是当前最好的选择?
我也经常被 extends
的重用所困扰,但在某种程度上确实如此。类型是 "a" | "b" | "c"
,但您可以使用其他可分配给它的东西,例如 "a" | "b"
:
type ObjectWithKeys<T, K extends keyof T> = {
[P in K]: T[P];
};
type A = {
a: number;
b: number;
c: number;
}
type X = ObjectWithKeys<A, "a" | "b">; // Works
从这个意义上说,您可以将 "a" | "b"
视为 "a" | "b" | "c"
的子类型(更专业的版本),就像具有 更多 属性的对象类型一样是一个具有其属性子集的子类型(我们也通过 extends
表示,具有接口和 class
语法)。
我们(好吧,我)习惯于认为子类型比超类型具有“更多的东西”,因为我习惯于考虑对象类型(这是真的,{a: number; b: number;}
是 {a: number;}
的子类型),但对于联合来说,情况恰恰相反,子类型的成员比超类型少 。
这是来自 this tuturial
的 TypescriptPick
实用程序类型的基本实现
type ObjectWithKeys<T, K extends keyof T> = {
[P in K]: T[P];
};
我不明白它的作用,但我发现 K extends keyof T
的使用有点令人困惑。我们要确保 K 是联合类型 keyof T
的成员(或成员的联合)。它永远不会“扩展”它,所以为什么要在这里使用 extends
运算符?
Typescript 是否缺少运算符,这是当前最好的选择?
我也经常被 extends
的重用所困扰,但在某种程度上确实如此。类型是 "a" | "b" | "c"
,但您可以使用其他可分配给它的东西,例如 "a" | "b"
:
type ObjectWithKeys<T, K extends keyof T> = {
[P in K]: T[P];
};
type A = {
a: number;
b: number;
c: number;
}
type X = ObjectWithKeys<A, "a" | "b">; // Works
从这个意义上说,您可以将 "a" | "b"
视为 "a" | "b" | "c"
的子类型(更专业的版本),就像具有 更多 属性的对象类型一样是一个具有其属性子集的子类型(我们也通过 extends
表示,具有接口和 class
语法)。
我们(好吧,我)习惯于认为子类型比超类型具有“更多的东西”,因为我习惯于考虑对象类型(这是真的,{a: number; b: number;}
是 {a: number;}
的子类型),但对于联合来说,情况恰恰相反,子类型的成员比超类型少 。