TypeScript 常用类型总结
TypeScript 内置了一些较常用的类型,这些类型似于高阶函数,输入一个类型,返回一个新的类型:
1 | // 伪代码 |
下面我们介绍下这些常用的类型以及写几个我们自己的常用类型。
Readonly<T>
将 T 中的属性变为只读(内置)。
1 | type Readonly<T> = { readonly [P in keyof T]: T[P] }; |
##Required<P>
将 P 中的属性变为必选(内置)。
1 | type Required<T> = { [P in keyof T]-?: T[P] }; |
Required2<T, P>
将 T 中的 P 属性变为必选(非内置)。
1 | // 不包含需要可选属性的对象 & 只包含可选值得对象并进行可选操作 |
Partial<T>
将 T 中的属性变成可选(内置)。
1 | type Partial<T> = { [P in keyof T]?: T[P] }; |
Partial2<T, P>
将 T 中 P 属性变为可选(非内置)。
1 | // 不包含需要可选属性的对象 & 只包含可选值得对象并进行可选操作 |
Pick<T, K>
从 T 中选择出 K 属性(内置)组成新的对象。
1 | type Pick<T, K extends keyof T> = { [P in K]: T[P] }; |
Record<K, T>
用属性为 K 的类型,值为 T 的类型生成新的对象(内置)。
1 | type Record<K extends keyof any, T> = { |
Omit<T, K>
从对象 T 中排除属性是 K 的属性(没有内置)。
1 | Omit<T, K> = Pick<T, Exclude<keyof T, K>> |
Exclude<T, U>
从 T 中排除是 U 的类型(内置)。
1 | type Exclude<T, U> = T extends U ? never : T; |
Extract<T, U>
从 T 中提取属于 U 的类型(内置)。
1 | type Extract<T, U> = T extends U ? T : never; |
[keyof T]
获取 value
获取值为 function 类型的 key。
1 | type FunctionPropertyNames<T> = { |
1 | type PersonValue = Person[keyof Person]; // "string" | "number" |
Filter<T, P>
过滤 T 中值类型为 P 类型的 key 组成新的对象(非内置)。
1 | type FilterType<T, P> = { [K in keyof T]: T[K] extends P ? K : never }[keyof T]; |
这里利用了条件类型(Conditional Types),使用条件类型可以完成更多操作。
比如我们要让一个对象所有的属性变成可选,包括深层次的对象引用:
1 | type Child = { |
1 | type PartialDeep<T> = { |
1 | type PartialTP = PartialDeep<TP>; |
Mutable<T>
T 变成可写。
1 | type Mutable<T> = { -readonly [P in keyof T]: T[P] }; |
ReturnType<T>
获取函数返回类型(内置)。
1 | type ReturnType<T extends (...args: any) => any> = T extends ( |
NonNullable<T>
排除 null 和 undefined
1 | type NonNullable<T> = T extends null | undefined ? never : T; |
keyof 关键字
keyof T 用来获取 T 中的属性名。
获取对象的所有属性:
1 | type GetAllProps<T> = { [K in keyof T]: K }[keyof T]; |
获取对象的所有 value 类型:
1 | type GetAllValues<T> = T[keyof T]; |
获取数组类型中所有的类型:
1 | type Info = [string, number]; |
显然返回方法类型不是我们想要的,需要把它们过滤掉:
1 | type ArrValueOf<T extends any[]> = T[(keyof T) extends Number |
1 | type GetAllArrValues<T extends any[]> = T[(keyof T) extends Number |
infer 关键字
infer 关键字常被用来获取函数返回类型。
我们看以下 ReturnType 的定义:
1 | type ReturnType<T extends (...args: any) => any> = T extends ( |
infer 关键字的含义是:获得 infer 所在位置的推断类型并赋值给 R。上例中 infer 的位置刚好是在函数的返回值,所以 R 就为函数返回类型了。
下面我们利用 infer 来获取任意一个函数参数类型:
1 | type ArgumentsType<T extends (...args: infer AType) => any> = AType; |
上边这种写法是不允许的,因为 infer 只允许在 extends 的条件判断类型中使用,所以我们要强行构造一个条件判断:
1 | type ArgumentsType<T extends (...args: any) => any> = T extends ( |
1 | type Fn = (a: string, b: number) => string; |
is 关键字
is 关键字 常用语类型断言:something is Type。这个在判断联合类型时经常用到。
1 | interface Bird { |