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];
}
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];
}
用在定义泛型中:
<T, K extends keyof T>
用在定义类型中:
{
readonly [P in keyof T]: T[P];
}
泛型是 <>
内,类型在 {}
内。
看下来好像是这么用的。
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.3k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
5 回答3.8k 阅读
keyof T
是T
类型的键集,比如in
可以理解为for ... in
,表示从keyof T
中去遍历每一个类型,用上述的例子就是分别是"a"
、"b"
和"c"
类型。注意这里他们不是string
类型,而是literal string
类型,是某个具体的字符串类型。比如"a"
类型的变量就只能是"a"
值。这里提到了“子类型”,与之相对的是“父类型”。简单的理解,可以从逻辑上这么认为
而
K extend keyof T
表示K
是T
的子类型,这里是一个类型约束声明。比如type T = "a" | "b" | "c";
,那么K
可以是"a"
,也可以是"a" | "c"
或者"a" | "b" | "c"
等