🌙 Partial
可选
Partial
将属性变为可选属性,加上?
type MyPartial<T> = {
[P in keyof T]?: T[P];
}
1
2
3
2
3
interface IUser {
name: string;
age: string;
gender: 'male' | 'female'
}
const user1: IUser = {
name: 'Joke',
age: 20,
gender: 'female'
}
const user2: Partial<IUser> = {
name: 'Joke',
age: 20
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
🌙 Required
必选
Required
将属性变为必选属性,去掉?
type MyRequired<T> = {
[P in keyof T]-?: T[P];
}
1
2
3
2
3
interface IUser {
name: string;
age: string;
gender?: 'male' | 'female'
}
const user1: IUser = {
name: 'Joke',
age: 20,
}
const user2: Required<IUser> = {
name: 'Joke',
age: 20,
gender: 'female'
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
🌙 Readonly
只读
Readonly
将属性变为只读,加上readonly
type MyReadOnly<T> = {
readonly [P in keyof T]: T[P];
}
1
2
3
2
3
🌙 Pick
挑选
Pick<T,K extends keyof T>
挑选属性,从T
中挑出K
的属性
type MyPick<T, K extends keyof T> = {
[P in K]: T[P];
}
1
2
3
2
3
🌙 Record
记录
Record<K extends keyof any, T>
用于创建一个具有同类型属性值的对象。
type MyRecord<K extends keyof any, T> = {
[P in K]: T;
}
1
2
3
4
2
3
4
🌙 Exclude
剔除
Exclude<T,U>
从类型 T
中剔除所有可以赋值给 U
的属性,然后构造一个类型。主要用于联合类型。
type MyExclude<T, U> = T extends U ? never : T;
1
🌙 Extract
附加
Extract<T,U>
功能与 Exclude
相反
type MyExtract<T, U> = T extends U ? T : never;
1
🌙 Omit
剔除特例
Omit<T, K extends keyof any>
主要用于剔除interface
中的部分属性。
比如接口IUser1
包含name、age、firstName、lastName、location
属性,而接口IUser2
不包含location
属性,我们可以使用前面提到的Pick
实现,但这样会比较复杂,所以有了Omit
操作符。
type MyOmit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
1
interface IUser1 {
name: string;
age: string;
firstName: string;
lastName:string;
location: string;
}
type IUser2 = Omit<IUser1, 'location'>
const user1: IUser1 = {
name: 'user1',
age: 18,
firstName: 'Jack',
lastName: 'Green',
location: 'New York'
}
const user2: IUser2 = {
name: 'user2',
age: 18,
firstName: 'Jack',
lastName: 'Green',
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24