Skip to content
On this page

索引类型

在开发中经常会遇到这样的场景:从对象中获取一些属性的值,然后建立一个集合

getValue 函数

抽取 obj 对象的一些值,形成一个数组

typescript
let obj = {
  a: 1,
  b: 2,
  c: 3,
};

function getValue(obj: any, keys: string[]) {
  return keys.map((key) => obj[key]);
}
// 打印出 [1,3]
console.log(getValue(obj, ["a", "c"]));
// ts 不会报错  并且打印出 [undefined,undefined]
console.log(getValue(obj, ["e", "f"]));
1
2
3
4
5
6
7
8
9
10
11
12
13

查询操作符

keyof T 表示类型 T 的所有公共属性的字面量联合类型

typescript
interface Obj {
  a: number;
  b: string;
}
// 类型推断为  let key: "a" | "b"
let key: keyof Obj;
1
2
3
4
5
6

索引访问操作符

T[K] 表示对象 T 的属性 K 所代表的类型

typescript
// 类型推断为   let value: number
let value: Obj["a"];
1
2

泛型约束

T extends U 表示泛型变量可以通过继承某些类型,以获得某些属性

getValue 函数改造

需求:参数 keys 里面的元素一定是参数 obj 里面的属性 定义一个泛型变量 T,用来约束 obj, 定义一个泛型变量 K,用来约束 keys 数组,给 keys 的元素 key 添加一个类型约束,即让 K 继承所有 obj 所有属性的联合类型,函数的返回值,首先是一个数组,数组元素的类型是 K 对应类型

typescript
let obj = {
  a: 1,
  b: 2,
  c: 3,
};

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

console.log(getValue(obj, ["a", "c"]));
/*
不能将类型“"e"”分配给类型“"a" | "c" | "b"”。
*/
console.log(getValue(obj, ["e", "f"]));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

总结

索引类型可以实现 对象属性的查询和访问, 然后再配合泛型约束,就能使我们建立对象,对象属性,以及属性值之间的约束关系

沪ICP备20006251号-1