Typescript 在 Pick 实现中进行了扩展

Wil*_*ins 4 types typescript

这是本教程中TypescriptPick实用程序类型的基本实现

type ObjectWithKeys<T, K extends keyof T> = {
  [P in K]: T[P];
};
Run Code Online (Sandbox Code Playgroud)

我明白它的作用,但我发现它的用法K extends keyof T有点令人困惑。我们要确保 K 是联合类型 的成员(或成员的联合)keyof T。它永远不会“扩展”它,那么为什么extends在这里使用运算符呢?

Typescript 是否缺少运算符,而这是当前最好的选择?

T.J*_*der 5

我经常对 Too 的重用感到困扰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
Run Code Online (Sandbox Code Playgroud)

游乐场链接

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

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

  • 仅在联合的情况下缩小。干得好@TJ Crowder! (4认同)