【TypeScript 高级应用】索引类型与索引操作符

2023/03/07 15:31:35

pluck() 函数用于从对象中提取指定属性值:

function pluck(obj, names) {
  return names.map((n) => obj[n]);
}

pluck({ name: "222", age: 11 }, ["name"]); // ['222']

对于这个函数,期望中的 names 的取值范围是 Object.keys(obj),可以利用索引类型在 ts 中实现这个函数。

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

const obj = { name: "222", age: 11 };

pluck(obj, ["name", "color"]); // obj 中不存在 color 属性,编译器报错

这样实现之后,在填写二参时编译器会给出可选值提示,可选值为 obj 上的 key。

这里使用了两个类型操作符:

  • keyof 索引类型查询操作符

对于任何类型 T, keyof T 的结果为 T 上已知的公共属性名的联合。 例如:

interface Person {
  name: string;
  age: number;
}
let personProps: keyof Person; // 'name' | 'age'

这里 K 的类型定义为 K extends keyof TArray<K>,相当于 K: 'name' | 'age'

  • T[K] 索引访问操作符

K 的类型是 T 上已知的公共属性名的联合,T[K] 则相当于访问 T 上的属性的类型,返回值类型为 Array<T[K]> 则表示返回值类型为 Array<number|string>