关于泛型理解的一点疑惑
function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
return names.map(n => o[n]);
}
interface Person {
name: string;
age: number;
}
let person: Person = {
name: 'Jarid',
age: 35
};
let strings: string[] = pluck(person, ['name']);
有一個疑問:K extends keyof T => type K = 'name' | 'age'
但是調用函數時 根據類型推斷 K[] => string[] => string
換句話說 K的類型是string
但是泛型裡面是聯合類型 所以
問題:這個K的類型怎麼理解
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
'name'[]
=> 为name字面量类型的数组首先,获取参数
o
的类型T
。因为传入的变量person
的类型为Person
,因此推导T
为Person
。然后,推导
K
。因为K extends keyof T
,keyof T
的类型为"name" | "age"
,而K
继承了它,所以K
的类型也为"name" | "age"
。所以
name
变量的类型也就出来了。最后是返回值。
T[K]
和javascript
类似,意思是类型T
中键为K
的值的类型。所以返回值类型就和传入的names
一一对应了。当然,顺序并不保证。K是有限定的:
K extends keyof T
,说K是string
是不准确的,K是一个联合类型,类型范围是keyof T