【问题标题】:Typescript extends in Pick implementationTypescript 在 Pick 实现中扩展
【发布时间】:2022-01-15 20:22:20
【问题描述】:

这是来自 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 是否缺少运算符,这是当前最好的选择吗?

【问题讨论】:

  • 这是说K 应该分配给keyof T 的打字稿方式。例如:type Result = 'foo' extends 'foo' | 'bar' ? true : false Result 将是 true typescriptlang.org/play?#code/…
  • @AlekseyL 似乎又回到了前面,我要疯了吗?感觉就像它应该是例如'foo' isIn 'foo' | 'bar'
  • @WillJenkins - 不,但工会就是这样。 :-)
  • 很高兴你问了这个问题,让我对一直困扰我的事情深思熟虑,真的很有用。
  • 一点也不傻。 当条件类型作用于泛型类型时,它们在给定联合类型时变得可分配,这意味着条件将分别应用于每个联合成员,结果将被打包到联合中。还要注意extends 在两个不同的特性中被重用:1 - 泛型类型约束和 2 - 条件类型。

标签: typescript types


【解决方案1】:

我也经常被 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;} 的子类型),但对于联合,情况正好相反,子类型的成员比超类型的成员

【讨论】:

  • 所以extends 实际上的意思是“相同类型或变窄”。好的,我想我明白了。干杯。
  • @WillJenkins - 是的,或者“与what Aleksey said 相同或子类型”,这是what Aleksey said、“可分配给”(或“分配兼容”)的另一种说法。
  • 仅在联合的情况下缩小。很好地把@T.J.克劳德!
猜你喜欢
  • 2016-06-29
  • 2015-06-02
  • 2016-12-14
  • 1970-01-01
  • 2013-07-09
  • 2016-08-14
  • 2019-08-20
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多