Pick<Type, Keys>

  • 作用: 从 Type 选择一组 Keys 属性
  • 使用:
1
2
3
4
5
6
7
8
9
10
11
12
export interface Todo {
remark: string;
required: boolean;
hobby: string[];
}

const A: Pick<Todo, "remark" | "required"> = {
remark: "111",
required: false,
};

// 表示A只能有 remark、required
  • 实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// K extends keyof T,这句表示,确保 K 是 T 的子集

// keyof: 取 interface 的键后保存为联合类型
// in: 取联合类型的值,主要用于数组和对象的构建

// 用于实际开发,举个例子:

// function getValue(o:object, key: string){
// return o[key]
// }
// const obj1 = { name: '张三', age: 18 }
// const values = getValue(obj1, 'name')

// 这样写丧失了 ts 的优势:

// 无法确定返回值类型
// 无法对key进行约束

// function getValue<T extends Object,K extends keyof T>(o: T,key: K): T[K] {
// return o[key]
// }
// const obj1 = { name: '张三', age: 18}
// const values = getValue(obj1, 'name')

// 如果第二个参数不是 obj1 中的参数就会报错

Readonly

  • 作用:Readonly 会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会被 readonly 所修饰。也就是不可以再对该对象的属性赋值。
  • 使用:
1
2
3
4
5
6
7
8
9
10
11
12
interface Todo {
title: string;
description: string;
}

const todo: Readonly<Todo> = {
title: "Hey",
description: "foobar",
};

todo.title = "Hello"; // Error: cannot reassign a readonly property
todo.description = "barFoo"; // Error: cannot reassign a readonly property
  • 实现:
1
2
3
4
5
6
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};

// readonly修饰符,首先是一个关键字
// 对类中的属性成员进行修饰,修饰之后,该属性成员就不能修改了,只能够进行访问