为了方便开发者 TypeScript 内置了一些常用的工具类型,比如 Partial、Required、Readonly、Record 和 ReturnType 等。下面对这些类型进行一一介绍
- Record
作用: 将对象属性的值转化为T类型
定义:
Record <K extends keyof any,T>
示例:以上代码可以解读为:type Property = 'use1' | 'user2' type User = Record<Property,string> const u:User = { user1:'张三', user2:'李四' }
将对象Property的属性user1和user2的值转化为string,然后直接赋值给下面的变量u使用 - Readonly
作用: 将对象或者数组的值转换为只读的
定义:Readonly <T>
示例:interface User{ name:string; age:number; } let user:Readonly<User> = { name:'张三', age:12 } user.age = 13//error
以上代码可以解读为:
用Readoly处理之后,接口User的所有属性都变为了只读属性,这样类型为接口User的变量user的属性就不能被重新赋值,否则就会报错。
- Required
作用:将类型的所有属性变成必选
定义:示例:type Required<T> = { [P in keyof T]-?:T[P] }以上代码可以解读为:interface User{ name?:string; age?:number; } let user:Required<User> = { name:'张三', age:12 // age或者name属性缺一不可 }
用Required处理之后,接口User的所有属性都变为了必选,这样类型为接口User的变量user的属性就都是必选的,否则就会报错。 - Partial
作用:将类型的所有属性变成可选
定义:示例:type Partial<T> = { [P in keyof T]?:T[P] }interface User{ name:string; age:number; } let user:Partial<User> = { name:'张三'//不报错 }
以上代码可以解读为:
用Partial处理之后,接口User的所有属性都变为了可选,这样类型为接口User的变量user的属性就都是可选的。
- Extract
作用:提取联合类型中的某些类型,Extact<T,U>,表示从T中提取U
定义:示例:type Extract<T, U> = T extends U ? T : never;type U = Extract<string|number|(()=>void),Function>// ()=>void
以上代码可以解读为:
提取联合类型string|number|(()=>void中的函数类型()=>void
- Exclude
作用:移除联合类型中的某些类型,Exclude<T,U>,表示从T中移除U
定义:示例:type Exclude<T, U> = T extends U ? never : T;type U = Exclude<string|number|(()=>void),Function>// string|number
以上代码可以解读为:
移除联合类型string|number|(()=>void中的函数类型()=>void
- Pick
作用:从类型中挑出一些属性
定义:示例:type Pick<T, K extends keyof T> = { [P in K]: T[P]; }interface User{ name:string; age:number; habbit:string; } let user:Pick<User,'name'|'age'> = { name:'张三', age:12 }
以上代码可以解读为:
用Pick提取了接口User的name和age属性,这样类型为接口User的变量user的属性就是提取出来的这两个
- Omit
作用:从类型移除一些属性
定义:示例:type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;interface User{ name:string; age:number; habbit:string; } let user:Omit<User,'name'|'age'> = { habbit:'pingpong' }
以上代码可以解读为:
用Omit移除了接口User的name和age属性,这样类型为接口User的变量user的属性就只有habbit了
- NonNullable
作用: 去除类型中的null和undefined属性
定义:示例:type NonNullable<T> = T extends null | undefined ? never : T;type U = NonNullable<string[]|null|undefined>;//string[]
以上代码可以解读为:
用NonNullable移除了联合类型string[]|null|undefined的null和undefined属性,然后赋值给了U,这样类型U的类型就只剩下string[]了
- Parameters
作用: 获取函数的参数类型所组成的元组类型
定义:示例:type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;以上代码可以解读为:type U = Parameters<(a:number,b:string)=>void>//[number,string]
用Parameters获取了函数的参数a、b的类型number、string,并将number、string组成了元组 - ReturnType
作用:获取函数的返回值类型
定义:示例:type ReturnType<T extends (...args: any[]) => any> = T extends ( ...args: any[] ) => infer R ? R : any;type Func = (a:number,b:string)=>string const u:ReturnType<Func> = 'abc'
以上代码可以解读为:
用ReturnType获取了函数的返回值类型string,这样类型为Func的常量user的类型就是string了