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

Playground link

从这个意义上说,您可以将 "a" | "b" 视为 "a" | "b" | "c" 的子类型(更专业的版本),就像具有 更多 属性的对象类型一样是一个具有其属性子集的子类型(我们也通过 extends 表示,具有接口和 class 语法)。

我们(好吧,)习惯于认为子类型比超类型具有“更多的东西”,因为我习惯于考虑对象类型(这是真的,{a: number; b: number;}{a: number;} 的子类型),但对于联合来说,情况恰恰相反,子类型的成员比超类型少