未约束的问题
从对象中获取一些属性的值,然后建立一个集合
let obj = {
a: 1,
b: 2,
c: 3
}
// 获取对象中的指定属性的值集合
function getValues(obj: any, keys: string[]) {
return keys.map(key => obj[key])
}
// 抽取指定属性的值
console.log(getValues(obj, ['a','b'])) // [1, 2]
// 抽取obj中没有的属性:
console.log(getValues(obj, ['e','f'])) // [undefined, undefined]虽然obj中并不包含e, f属性,但TS编译器并未报错
进行约束
约束目的:
从obj对象中抽取的属性数组keys中的元素,一定得是obj对象中的属性
思路:
- 定义泛型变量T, K,分别约束obj对象和keys数组
- 为K增加一个泛型约束,使K必须是Obj的所有属性的联合类型之一, 即
K extends keyof T - base::keyof操作符
- 此时,函数返回值类型-数组的元素类型,就是属性K对应的数组,即
T[K][] - base::索引访问类型
代码改造:
function getValues<T,K extends keyof T>(obj: T, keys: K[]): T[K][] {
return keys.map(key => obj[key])
}