typescript的utiltity types类型

  • Partial: 将T的属性转为可选?
  • Readonly: 将T的属性转为只读
  • Record:将属性K的类型指定为T类型
  • Pick: 获取T中的部分K属性,只保留K选择的属性
  • Omit: 从T中删除定义的K属性,排除K选择的属性
  • Exclude: 从T中剔除可以赋值给U的类型
  • Extract: 提取T中可以赋值给U的类型。
  • NonNullable: 从T中剔除null和undefined。
  • Parameters: 获取函数参数类型
  • ConstructorParameters: 获取构造函数的参数类型
  • ReturnType: 获取函数返回值类型
  • InstanceType: 获取构造函数类型的实例类型。
  • Required:将T的属性转为必选!
  • ThisParameterType
  • OmitThisParameter
  • ThisType

    Partial

    将T的属性转为可选?
    1. type A = {a:number, b:string}
    2. type A1 = Partial<A> // { a?: number; b?: string;}

    Required

    将T的属性全转为必选!
    1. type A = {a?:number, b?:string}
    2. type A1 = Required<A> // { a: number; b: string;}

    Pick

    获取T中的部分K属性,只保留K选择的属性
    1. type A = {a:number, b:string}
    2. type A1 = Pick<A, 'a'> // {a:number}

    Omit

    排除K中选择的属性
    1. type A = {a:number, b:string}
    2. type A1 = Omit<A, 'a'> // {b:string}

    Record

    创建一个类型,K代表值的类型, T代表值的类型
    1. type A1 = Record<number, string> // 等价{ [x: number]: string };

    Exclude

    过滤T中和U相同(或兼容)的类型
    1. type A1 = Exclude<number|string, string|number[]> // number
    2. // 兼容
    3. type A2 = Exclude<number|string, any|number[]> // never , 因为any兼容number, 所以number被过滤掉

    Extract

    提取T中和U相同(或兼容)的类型
    1. type A1 = Extract<number|string, string|number[]> // string

    NonNullable

    剔除T中的undefined和null
    1. type A1 = NonNullable<number|string|null|undefined> // number|string

    ReturnType

    获取函数返回值类型
    1. type A1= ReturnType<()=>number> // number

    InstanceType

    返回构造函数实例的类型
    ts中类有2种类型, 静态部分的类型和实例的类型, 所以T如果是构造函数类型, 那么InstanceType可以返回他的实例类型 ```typescript interface A{ a:HTMLElement; }

interface AConstructor{ new():A; }

function create (AClass:AConstructor):InstanceType{ return new AClass(); }

  1. <a name="YeI3H"></a>
  2. ### Parameters<T>
  3. 获取函数参数类型,返回类型为元祖, 元素顺序同参数顺序
  4. ```typescript
  5. interface A{
  6. (a:number, b:string):string[];
  7. }
  8. type A1 = Parameters<A> // [number, string]

ConstructorParameters


获取构造函数的参数类型

  1. interface AConstructor{
  2. new(a:number):string[];
  3. }
  4. type A1 = ConstructorParameters<AConstructor> // [number]

extends(条件类型)

  1. T extends U ? X : Y

用来表示类型是不确定的, 如果U的类型可以表示T, 那么返回X, 否则Y

  1. type A = string extends '123' ? string :'123' // '123'
  2. type B = '123' extends string ? string :123 // string

infer(类型推断)

单词本身的意思是”推断”, 实际表示在extends条件语句中声明待推断的类型变量

  1. type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

声明一个P用来表示…args可能的类型, 如果(…args: infer P)可以表示 T, 那么返回…args对应的类型, 也就是函数的参数类型, 反之返回never.
注意: 开始的T extends (…args: any) => any用来校验输入的T是否是函数, 如果不是函数ts会报错, 如果直接替换成T不会有报错, 会一直返回never.

接下来利用infer来实现”删除元祖类型中第一个元素”, 常用于简化函数参数

  1. export type Tail<Tuple extends any[]> = ((...args: Tuple) => void) extends ((a: any, ...args: infer T) => void) ? T : never;

Omit、Pick、Exclude三者的区别

Omit< key:value,key>

  • 作用:基于已经声明的类型进行属性剔除获得新类型
  • 用例:
    1. type User = {
    2. id: string;
    3. name: string;
    4. email: string;
    5. };
    6. type UserWithoutEmail = Omit<User, "email">;// UserWithoutEmail ={id: string;name: string;}

Pick< key:value,key >

  • 作用:从KeyValue中挑选出部分Key对应的类型当作新类型使用(与omit相反,omit是剔除声明项,pick是挑选声明项)
  • 用例:

    1. interface Todo {
    2. title: string;
    3. description: string;
    4. completed: boolean;
    5. }
    6. type TodoPreview = Pick<Todo, "title" | "completed">;
    7. const todo: TodoPreview = {
    8. title: "Clean room",
    9. completed: false
    10. };

    Exclude< T, U >

  • 作用:T中取T、U交集的补集

  • 与Omit作比较:
    • Omit左右两个参数属于不同类型,左是一个完整的类型,包含key、value,右侧只有key
    • Exclude左右两个参数属于同种类型
  • 用例:
    1. type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
    2. type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // "c"
    3. type T2 = Exclude<string | number | (() => void), Function>; // string | number
    |
    - 相同点:
    - 三种工具类都是使用已有的类型进行属性过滤获得新的类型
    - Omit和Exclude都是做属性剔除
    - Omit和Pick的参数类型都是<{key:value},key>
    - 不同点:
    - Exclude的参数类型没有限制,可以是字面量也可以是具体的类型如string、boolean等,而Omit和Pick的第二参数则必须是第一参数的子属性
    - Pick搭配Exclude实现Omit:Exclude先剔除不要的键名,挑出想要的键名,Pick再从键值对中根据键名挑选出来。
    实现公式:Omit=Pick>。其中:T: K:key
    | | —- |