TypeScript中工具类型的使用与源码理解(二):Pick、Omit、Required、Partial、Readonly

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

强烈建议先看上一篇:TypeScript中工具类型的使用与源码理解(一):Extract、Exclude、Record

  1. Pick

    Pick用来抓取某种数据类型的属性,但实际工作中,主要用来提取接口或type定义的对象类型中的属性。

    • 源码
      // 通过K extends keyof T,将K的范围约束在T的属性名组成的联合类型中
      // [P in K]: T[P],将K迭代,并确认各个属性的相应的类型
      type Pick<T, K extends keyof T> = {
           [P in K]: T[P];
       };
      
    • 示例
       // PickTest最终类型为
       // type PickTest = {
       //    id: number;
       //    name: string;
       // }
       type PickTest = Pick<GoodsType, 'id' | 'name'> 
      
  2. Omit

    Omit功能与Pick相反,用来去除不需要的属性

    • 源码
      // 通过`Exclude<keyof T, K>`获取**不包含在类型`K`之内**的所有属性名组成的联合类型
      // 通过`Pick<T, Exclude<keyof T, K>>`,生成包含上述属性的对象类型
      type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
      
    • 示例
      interface ReturnInterface {
         code: number
         msg: string
       }
      
       // RequiredTest最终类型为
       // type RequiredTest = {
       //    msg: string
       // }
       type RequiredTest = Omit<ReturnInterface, 'code'>
      
  3. Required

    Required用来接口或type定义的对象类型中的可选属性转换成必选属性。

    • 源码
      type Required<T> = {
          // 迭代T的属性名组成的联合类型,将T中每个属性中代表可选的"?"去除
          [P in keyof T]-?: T[P];
      };
      
    • 示例:
      interface ReturnInterface {
         code: number
         msg?: string
       }
      
       // RequiredTest最终类型为
       // type RequiredTest = {
       //    code: number
       //    msg: string
       // }
       type RequiredTest = Required<ReturnInterface>
      
  4. Partial

    PartialRequired的功能正好相反,用来接口或type定义的对象类型中的所有属性转换成可选属性。

    • 源码
      type Partial<T> = {
          // 迭代T的属性名组成的联合类型,将T中每个属性后添加代表可选的"?"。
          [P in keyof T]?: T[P];
      };
      
    • 示例:
      interface ReturnInterface {
         code: number
         msg?: string
       }
      
       // RequiredTest最终类型为
       // type RequiredTest = {
       //    code?: number
       //    msg?: string
       // }
       type RequiredTest = Required<ReturnInterface>
      
  5. Readonly

    用来接口或type定义的对象类型中的所有属性转换成只读属性。

    • 源码
      type Readonly<T> = {
        readonly [P in keyof T]: T[P];
      };
      
    • 示例:
      interface ReturnInterface {
         code: number
         msg?: string
       }
      
       // RequiredTest最终类型为
       // type RequiredTest = {
       //    readonly code: number
       //    readonly msg?: string
       // }
       type RequiredTest = Readonly<ReturnInterface>