TS 内置 all 工具类型

328 阅读2分钟

Partial

将 T 中的所有属性设置为可选

type Partial<T> = { [P in keyof T]?: T[P] | undefined; }
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Partial<User>;

re:
type NewType = {
    name?: string | undefined;
    sex?: string | undefined;
    age?: number | undefined;
}

Readonly

将 T 中的所有属性设置为只读

type Readonly<T> = { readonly [P in keyof T]: T[P]; }
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Readonly<User>;

re:
type NewType = {
    readonly name: string;
    readonly sex: string;
    readonly age: number;
}

Required

将 T 中的所有属性设置为必须

type Required<T> = { [P in keyof T]-?: T[P]; }

-? 表示取消可选

eg:
interface User {
  name: string;
  sex?: string;
  age?: number;
}
type NewType = Required<User>;

re:
type NewType = {
    name: string;
    sex: string;
    age: number;
}

Pick<T, K>

从 T 中,选择一组位于 K 中的属性

type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Pick<User, 'name' | 'sex'>;

re:
type NewType = {
    name: string;
    sex: string;
}

Exclude<T, U>

从 T 中排除可分配给 U 的类型

type Exclude<T, U> = T extends U ? never : T;
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Exclude<keyof User, 'name' | 'sex'>;

re:
type NewType = "age"

Extract<T, U>

从 T 中提取可分配给 U 的类型

type Extract<T, U> = T extends U ? T : never;
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Extract<keyof User, 'name' | 'sex'>;

re:
type NewType = "name" | "sex"

Omit<T, K>

构造一个属性为 T 的类型,但类型 K 中的属性除外

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Omit<User, 'name' | 'sex'>;

re:
type NewType = {
    age: number;
}

Record<T, K>

使用类型为 T 的一组属性 K 构造一个类型

type Record<K extends keyof any, T> = {
    [P in K]: T;
};
eg:
interface User {
  name: string;
  sex: string;
  age: number;
}
type NewType = Record<string, User>;

re:
type NewType = {
    [x: string]: User;
}

NonNullable

从 T 中排除 null 和 undefined

type NonNullable<T> = T extends null | undefined ? never : T;
eg:
type name = string | null | undefined;
type newType = NonNullable<name>;

re:
type newType = string

ReturnType

获取函数类型的返回类型

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
eg:
interface User {
  name: string;
  sex: string;
  age: number;
  getFamily: (name: string) => User[];
}
type NewType = ReturnType<User['getFamily']>;

re:
type NewType = User[]

Parameters

获取函数类型的参数,返回的是个元组

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
eg:
interface User {
  name: string;
  sex: string;
  age: number;
  getFamily: (name: string) => User[];
}
type NewType = Parameters<User['getFamily']>;

re:
type NewType = [name: string]

InstanceType

获取构造函数函数类型的返回类型

type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;
eg:
type NewType = InstanceType<new (name: string) => { name: string; age: number }>;

re:
type NewType = {
    name: string;
    age: number;
}

ConstructorParameters

获取构造函数类型的参数,返回的是个元组

type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;
eg:
type NewType = ConstructorParameters<new (name: string) => { name: string; age: number }>;

re:
type NewType = [name: string]

大小写

type NewType = Uppercase<'aaa'>; // AAA  全大写
type NewType = Lowercase<'AAA'>; // aaa   全小写
type NewType = Capitalize<'aaa'>; // Aaa   首字母大写
type NewType = Uncapitalize<'AAA'>; // aAA   首字母小写