Typescript 在 Pick 实现中进行了扩展

2024-02-04

这是 Typescript 的基本实现Pick实用程序类型来自本教程 https://learntypescript.dev/09/l3-condition-utility-types

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

游乐场链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBA8gRgKwgY2AdQJbABYGkIgDOAPACoA0UuUEAHsBAHYAmhUA1gQPYBmUpAPigBeKAG8AUFGlQA2gAUoGRlQC6ALn4LVAbgkBfPRNCQoAQRHipMgIabGAVwC2cCACc9MqHHvPXH62lkXxd3PX0JY3BoAA1LeCRUTBx8ImIzSgAiG0yoAB8oTLhMgR0oAHpyqDQuN3ZCIA

从这个意义上来说,你可以看到"a" | "b"作为子类型(更专业的版本)"a" | "b" | "c",就像一个对象类型more属性是一个子类型,其属性的子集(我们也通过extends,具有接口和class句法)。

我们(好吧,好吧,I'm)习惯于认为子类型比超类型拥有“更多的东西”,因为我习惯于考虑对象类型(这是真的,{a: number; b: number;}是一个子类型{a: number;}),但对于联合,情况正好相反,子类型有fewer成员多于超类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 在 Pick 实现中进行了扩展 的相关文章

随机推荐