🌙 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