Skip to content

内置工具类型

属性修饰工具类型

ts
type Partial<T> = {
  [P in keyof T]?: T[P];
};

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

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

结构工具类型

ts
// 一般使用 Record<string, unknown> 和 Record<string, any> 来代替 object
type Record<K extends keyof any, T> = {
  [P in K]: T;
};

type Dictionary<T> = {
  [index: string]: T;
};

type NumericDictionary<T> = {
  [index: number]: T;
};

// K extends keyof T 保证 联合类型 K 中的键值都是从 T 中来的
type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

// Exclude<A, B> 联合类型 A 中不存在于 B 中的部分
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

集合工具类型

ts
/**
 * 交集和差集是利用联合类型的分布式特性完成的
 */
// 交集 Intersection
type Extract<T, U> = T extends U ? T : never;

// 差集 Exclude
type Exclude<T, U> = T extends U ? never : T;

// 并集
type Concurrence<A, B> = A | B;

// 补集
type Complement<A, B extends A> = Exclude<A, B>;

// 相较于 null | undefined 的差集
type NonNullable<T> = Exclude<T, null | undefiend>;

模式匹配工具类型

ts
// 函数模式匹配
type FunctionType = (...args: any) => any;

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

type ReturnType<T extends FunctionType> = T extends (...args: any) => infer R
  ? R
  : any;

// Class 模式匹配
type ClassType = abstract new (...args: any) => any;

type ConstructorParameters<T extends ClassType> = T extends abstract new (
  ...args: infer P
) => any
  ? P
  : never;

type InstanceType<T extends ClassType> = T extends abstract new (
  ...args: any
) => infer R
  ? R
  : any;

infer 约束

ts
// 提取数组第一个类型
type FirstArrayItemType<T extends any[]> = T extends [infer P, ...any[]]
  ? P
  : never;

// 判断数组第一个是不是特定类型, 是则提取
type FirstArrayItemType<T extends any[]> = T extends [infer P extends string, ...any[]]
  ? P
  : never;
2025( )
今日 8.33%
本周 42.86%
本月 48.39%
本年 4.11%
Powered by Snowinlu | Copyright © 2024- | MIT License