TS泛型进阶

102 阅读1分钟

内置工具类型

type 属性 源码解析

Exclude

  • 排除(处理联合类型)
type Exclude<T, U> = T extends U ? never : T;

Extract

  • 提取
type Extract<T, U> = T extends U ? T : never;

Omit

  • 排除(处理对象类型)
type Omit<T, K extends keyof any> = { [P in Exclude<keyof T, K>]: T[P] };

Pick

  • 提取 K
type Pick<T, K extends keyof T> = { [P in K]: T[P] };

Record

  • 映射
type Record<K extends any, T> = { [P in K]: T };

Partial

  • 属性变为可选值
type Partial<T> = { [P in keyof T]?: T[P] };

Required

  • 属性变为必填项
type Required<T> = { [P in keyof T]-?: T[P] };

Readonly

  • 只读
type Readonly<T> = { readonly [P in keyof T]: T[P] };

NonNullable

  • 去掉 T 中的 null 和 undefined
type NonNullable<T> = T extends null | undefined ? never : T;
type NonNullable<T> = T & {};

Awaited

  • 作用是获取 async/await 函数或 promise 的 then() 方法的返回值的类型。而且自带递归效果
type Awaited<T> = T extends null | undefined
  ? T
  : T extends object & { then(onfulfilled: infer F): any }
  ? F extends (value: infer V, ...args: any) => any
    ? Awaited<V>
    : never
  : T;

Parameters

  • 作用是获取函数所有参数的类型集合,返回的是元组。T 自然就是函数了
type Parameters<T extends (...args: any) => any> = T extends (
  ...args: infer P
) => any
  ? P
  : never;

ReturnType

  • 作用是获取函数返回值的类型。T 为函数
type ReturnType<T extends (...args: any) => any> = T extends (
  ...args: any
) => infer R
  ? R
  : any;

ConstructorParameters/InstanceType

  • 我们知道 Parameters 和 ReturnType 这一对是获取普通/箭头函数的参数类型集合以及返回值类型的了,还有一对组合 ConstructorParameters 和 InstanceType 是获取构造函数的参数类型集合以及返回值类型的,和上面的比较类似我就放到一起了

Uppercase/Lowercase

  • 这俩儿的作用是转换全部字母大小写

Capitalize/Uncapitalize

  • 这俩儿的作用是转换首字母大小写