typescript

未约束的问题

从对象中获取一些属性的值,然后建立一个集合

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对象中的属性

思路:

  1. 定义泛型变量T, K,分别约束obj对象和keys数组
  2. 为K增加一个泛型约束,使K必须是Obj的所有属性的联合类型之一, 即K extends keyof T
  3. base::keyof操作符
  4. 此时,函数返回值类型-数组的元素类型,就是属性K对应的数组,即T[K][]
  5. base::索引访问类型

代码改造:

function getValues<T,K extends keyof T>(obj: T, keys: K[]): T[K][] {
  return keys.map(key => obj[key])
}