秒懂typescript内置的工具类型

176 阅读3分钟

为了方便开发者 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的属性user1user2的值转化为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提取了接口Usernameage属性,这样类型为接口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移除了接口Usernameage属性,这样类型为接口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|undefinednullundefined属性,然后赋值给了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获取了函数的参数ab的类型numberstring,并将numberstring组成了元组
  • ReturnType
    作用:获取函数的返回值类型
    定义:
    type ReturnType<T extends (...argsany[]) => any> = T extends (
      ...argsany[]
    ) => infer R
      ? R
      : any;
    
    示例:
    type Func = (a:number,b:string)=>string
    const u:ReturnType<Func> = 'abc'
    

以上代码可以解读为:
ReturnType获取了函数的返回值类型string,这样类型为Func的常量user的类型就是string

参考链接
(2022 typescript史上最强学习入门文章(2w字) - 掘金 (juejin.cn))