Typescript常用内置工具类型

Record

定义对象的key与value类型

源码

1
Record<key type, value type> 

Partial

生成新类型,该类型与T拥有相同的属性,所有属性变为可选

源码

1
2
3
type Partial<T> = {
[P in keyof T]?: T[P]
}

Required

生成一个新类型,该类型与T拥有相同的属性,但所有属性皆为必选项

源码

1
2
3
type Required<T> = {
[p in keyof T]-?: T[P]
}

Readonly

生成一个新类型,T中所有属性变为只读,不能修改

源码

1
2
3
type Readonly<T> = {
readonly [P in keyof T]: T[P];
}

Pick

生成一个新类型,返回T包含了K的属性集

源码

1
2
3
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
}

Exclude

如果T是U的子类型则返回never不是则返回T

源码

1
type Exclude<T, U> = T extends U ? never : T

示例

1
2
3
4
5
6
type A = number | string | boolean
type B = number | boolean

type Foo = Exclude<A, B>
// equals
type Foo = string

Extract

与Exclude相反

源码

1
type Extract<T, U> = T extends U ? T : never

示例

1
2
3
4
5
6
type A = number | string | boolean
type B = number | boolean

type Foo = Extract<A, B>
// equals
type Foo = number | boolean

Omit

生成一个新类型,该类型拥有T中除了K属性意外的所有属性

源码

1
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>> 

NonNullable

从泛型T中排除掉null和undefined

源码

1
type NonNullable<T> = T extends null | undefined ? never : T;

示例

1
2
3
4
5
type A = string | null | undefined

type B = NonNullable<A>
// equals
type B = string

Parameters

以元组的方式获得函数的入参类型

源码

1
Parameters<T extends (...args: any) => any>

示例

1
2
3
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
type t = Parameters<(name: string) => any>; // type t = [string]
type t2 = Parameters<((name: string) => any) | ((age: number) => any)>; // type t2 = [string] | [number]

ConstructorParameters

以元组的方式获得构造函数的入参类型

源码

1
ConstructorParameters<T extends new (...args: any) => any>

示例

1
2
3
4
type ConstructorParameters<T extends new (...args: any) => any> = T extends new (...args: infer P) => any ? P : never;

type t = ConstructorParameters<(new (name: string) => any) | (new (age: number) => any)>;
// type t = [string] | [number]

ReturnType

获得函数返回的类型

源码

1
ReturnType<T extends (...args: any) => any>

示例

1
2
3
4
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

type t = ReturnType<(name: string) => string | number>
// type t = string | number

InstanceType

获得构造函数返回值的类型

源码

1
InstanceType<T extends new (...args: any) => any>

示例

1
2
type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any;
type t = InstanceType<new (name: string) => {name: string, age: number}>