ts内置类型

2021/2/6 TS

🌙 Partial 可选

Partial 将属性变为可选属性,加上?

type MyPartial<T> = {
    [P in keyof T]?: T[P];
}
1
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

🌙 Required 必选

Required 将属性变为必选属性,去掉?

type MyRequired<T> = {
    [P in keyof T]-?: T[P];
}
1
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

🌙 Readonly 只读

Readonly 将属性变为只读,加上readonly

type MyReadOnly<T> = {
    readonly [P in keyof T]: T[P];
}
1
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

🌙 Record记录

Record<K extends keyof any, T>用于创建一个具有同类型属性值的对象。

type MyRecord<K extends keyof any, T> = {
    [P in K]: T;
}

1
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