在 TypeScript 中提供了许多自带的工具类型,因为这些类型都是全局可用的,所以无须导入即可直接使用。

操作接口类型

Partial

Partial 可以将一个类型的所有属性变成可选的,并且改工具类型返回的类型时给定类型的子集。

  1. type Partial<T> = {
  2. [P in keyof T]?: T[P];
  3. }; // 这里无需手动写,本身已经存在
  4. interface Person {
  5. name: string;
  6. age?: number;
  7. weight?: number;
  8. }
  9. type PartialPerson = Partial<Person>;
  10. // 相当于
  11. interface PartialPerson {
  12. name?: string;
  13. age?: number;
  14. weight?: number;
  15. }

Required

Required 可以将给定类型的所有属性都变成必填的。

  1. type Required<T> = {
  2. [P in keyof T]-?: T[P];
  3. } // 这里无需手动写,本身已经存在
  4. interface Person {
  5. name: string;
  6. age?: number;
  7. weight?: number;
  8. }
  9. type ReuiredPerson = Required<Person>;
  10. // 相当于
  11. interface RequiredPerson {
  12. name: string;
  13. age: number;
  14. weight: number;
  15. }

映射类型在键值的后面使用了一个 - 符号,- 与 ? 组合起来表示去除类型的可选属性,因此给定类型的所有属性都变为了必填。

Readonly

Readonly 将给定类型的所有属性设置为只读,给定类型的属性不可以被重选赋值。

  1. type Readonly<T> = {
  2. readonly [P in keyof T]: T[P];
  3. } // 这里无需手动写,本身已经存在
  4. interface Person {
  5. name: string;
  6. age?: number;
  7. weight?: number;
  8. }
  9. type NewPerson = Readonly<Person>;
  10. // 相当于
  11. interface ReadonlyPerson {
  12. readonly name: string;
  13. readonly age?: number;
  14. readonly weight?: number;
  15. }

Pick

Pick 将给定的类型中选取指定的键值,然后组成一个新的类型

  1. type Pick<T, K extends keyof T> = {
  2. [P in K]: T[P];
  3. } // 这里无需手动写,本身已经存在
  4. interface Person {
  5. name: string;
  6. age?: number;
  7. weight?: number;
  8. }
  9. type NewPerson = Pick<Person, 'name' | 'age'>
  10. // 相当于
  11. interface NewPerson {
  12. name: string;
  13. age?: number;
  14. }

Omit

Omit 将返回去除指定键值之后的新类型。

  1. type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>; // 这里无需手动写,本身已经存在
  2. interface Person {
  3. name: string;
  4. age?: number;
  5. weight?: number;
  6. }
  7. type NewPerson = Omit<Person, 'weight'>;
  8. // 相当于
  9. interface NewPerson {
  10. name: string;
  11. age?: number;
  12. }

Exclude 工具类型的作用就是从入参 T 属性的联合类型中排除入参 K 指定的若干属性。

联合类型

Exclude

Exclude 从联合类型中去除指定的类型。

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. weight?: number;
  5. }
  6. type Exclude<T, U> = T extends U ? never : T; // 这里无需手动写,本身已经存在
  7. type T = Exclude<'a' | 'b' | 'c', 'a'>; // => 'b' | 'c'
  8. type NewPerson = Omit<Person, 'weight'>;
  9. // 相当于
  10. type NewPerson = Pick<Person, Exclude<keyof Person, 'weight'>>;
  11. // 其中
  12. type ExcludeKeys = Exclude<keyof Person, 'weight'>; // => 'name' | 'age'

Extract

Extract 从联合类型中选取指定的类型

  1. type Extract<T, U> = T extends U ? T : never;
  2. type T = Extract<'a' | 'b' | 'c', 'a'>; // => 'a'

基于 Extract 实现一个获取接口类型交集的工具类型。

  1. type Intersect<T, U> = {
  2. [K in Extract<keyof T, keyof U>]: T[K];
  3. };
  4. interface Person {
  5. name: string;
  6. age?: number;
  7. weight?: number;
  8. }
  9. interface NewPerson {
  10. name: string;
  11. age?: number;
  12. }
  13. type T = Intersect<Person, NewPerson>;
  14. // 相当于
  15. type T = {
  16. name: string;
  17. age?: number;
  18. };

NoNullable

NoNullable 的作用是从联合类型中去除 null 和 undefined 的类型。

  1. type NewNonNullable<T> = T extends undefined | null ? never : T;
  2. type NewNonNullable1<T> = Exclude<T, undefined | null>;
  3. type N = NewNonNullable<string | number | null | undefined>;
  4. const NCONST: N= 1;

Record

Record 用于生成接口类型,传入的泛型参数分为作为接口类型的属性和值。

  1. type Record<K extends keyof any, T> = {
  2. [P in K]: T;
  3. };
  4. type MenuKey = 'home' | 'about' | 'more';
  5. interface Menu {
  6. label: string;
  7. hidden?: boolean;
  8. }
  9. const menus: Record<MenuKey, Menu> = {
  10. about: { label: '关于' },
  11. home: { label: '主页' },
  12. more: { label: '更多', hidden: true },
  13. };

函数类型

ConstructorParameters

ConstructorParameters,获取构造函数的参数

  1. class ColorClass {
  2. constructor(name: string, age: number, isChina: boolean) {}
  3. }
  4. let params: ConstructorParameters<typeof ColorClass>;
  5. // let params: [string, number, boolean]

Parameters

获取函数的参数。Parameters 可以用来获取函数的参数并返回

  1. function Fn(name: string, age: number, isChina: boolean) {}
  2. let fnP: Parameters<typeof Fn>;
  3. // let fnP: [string, number, boolean]

ReturnType

获取函数的返回类型。

  1. function Fn(name: string, age: number, isChina: boolean) {
  2. return 1;
  3. }
  4. let returnType: ReturnType<typeof Fn>;
  5. // let returnType: number

ThisParameterType

ThisParameterType 获取函数 this 参数类型

  1. function Fn(this: Window, name: string, age: number, isChina: boolean) {
  2. return 1;
  3. }
  4. let thisParameterType: ThisParameterType<typeof Fn>;
  5. // let thisParameterType: Window

ThisType

在对象字面量上指定 this 的类型。

注意:如果你想使用这个工具类型,那么需要开启noImplicitThis的 TypeScript 配置。

OmitThisParameter

OmitThisParameter 用来去除函数参数中 this 类型。

字符串类型

模板字符串

注意:TypeScript 自 4.1版本起开始支持模板字符串字面量类型。

  1. // 转换字符串字面量到大写字母
  2. type Uppercase<S extends string> = intrinsic;
  3. // 转换字符串字面量到小写字母
  4. type Lowercase<S extends string> = intrinsic;
  5. // 转换字符串字面量的第一个字母为大写字母
  6. type Capitalize<S extends string> = intrinsic;
  7. // 转换字符串字面量的第一个字母为小写字母
  8. type Uncapitalize<S extends string> = intrinsic;
  9. type T0 = Uppercase<'Hello'>; // => 'HELLO'
  10. type T1 = Lowercase<T0>; // => 'hello'
  11. type T2 = Capitalize<T1>; // => 'Hello'
  12. type T3 = Uncapitalize<T2>; // => 'hello'