前置知识: TypeScript

类型体操实用模式

1 minAdvanced2026/6/14

常见类型编程模式与技巧

1. 型判断工具

type IsNever<T> = [T] extends [never] ? true : false;
type IsAny<T> = 0 extends 1 & T ? true : false;
type IsUnknown<T> =
  IsNever<T> extends true
    ? false
    : IsAny<T> extends true
      ? false
      : unknown extends T
        ? true
        : false;
type IsEqual<A, B> = [A] extends [B] ? ([B] extends [A] ? true : false) : false;

2. 集合操作

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

// 交集
type Intersect<A, B> = A extends B ? A : never;

// 差集
type Diff<A, B> = A extends B ? never : A;

// 补集
type Complement<A, B extends A> = A extends B ? never : A;

3. 元组操作

type Head<T extends any[]> = T extends [infer H, ...any[]] ? H : never;
type Tail<T extends any[]> = T extends [any, ...infer R] ? R : never;
type Last<T extends any[]> = T extends [...any[], infer L] ? L : never;
type Reverse<T extends any[]> = T extends [infer H, ...infer R] ? [...Reverse<R>, H] : [];
type Length<T extends any[]> = T['length'];

4. 对象操作

type PickByType<T, U> = { [K in keyof T as T[K] extends U ? K : never]: T[K] };
type OmitByType<T, U> = { [K in keyof T as T[K] extends U ? never : K]: T[K] };
type OptionalKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? K : never }[keyof T];
type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];

5. 递归

type DeepReadonly<T> = { readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P] };
type DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] };
type DeepRequired<T> = { [P in keyof T]-?: T[P] extends object ? DeepRequired<T[P]> : T[P] };