ts中, 请问 in keyof T 和 extends key of T 两种用法有什么区别 ?

function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
return names.map(n => o[n]);
}
type Readonly = {
readonly [P in keyof T]: T[P];
}

阅读 12.3k
3 个回答

keyof TT 类型的键集,比如

image.png

注:上面因为直接用 keyof 看不出来 KA1 的类型集,用 Extract 排除一个不存在的类型 unknown 之后可以看出来。实际 KA1 和 KA 是等价的类型。

in 可以理解为 for ... in,表示从 keyof T 中去遍历每一个类型,用上述的例子就是分别是 "a""b""c" 类型。注意这里他们不是 string 类型,而是 literal string 类型,是某个具体的字符串类型。比如 "a" 类型的变量就只能是 "a" 值。

这里提到了“子类型”,与之相对的是“父类型”。简单的理解,可以从逻辑上这么认为

  • 子类型的值一定也是父类型。比如“猫”是“动物”的子类型,一只具体的 “猫”一定也是“动物”
  • 反之不成立,某个具体的“动物”不一定是“猫”,比如一只具体的“狗”。

K extend keyof T 表示 KT 的子类型,这里是一个类型约束声明。比如 type T = "a" | "b" | "c";,那么 K 可以是 "a",也可以是 "a" | "c" 或者 "a" | "b" | "c"

用在定义泛型中:

<T, K extends keyof T>

用在定义类型中:

{  
  readonly  [P in keyof T]: T[P];
}

泛型是 <> 内,类型在 {} 内。
看下来好像是这么用的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题