CodeWalk

TypeScript 常用工具类型:Partial、Required、Pick、Omit、Record、Exclude、ReturnType

作者:孤独的心 · 2026-05-30 12:55

请说明 TypeScript 内置工具类型的作用和使用场景,并手写实现。

回答

孤独的心

1. Partial:将所有属性变为可选

type Partial<T> = { [P in keyof T]?: T[P] };
// 场景:更新部分字段
function updateUser(id: string, updates: Partial<User>) {}

2. Required:将所有属性变为必选

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

3. Pick<T, K>:从 T 中选取部分属性

type Pick<T, K extends keyof T> = { [P in K]: T[P] };
// Pick<User, 'id' | 'name'> → { id: string; name: string }

4. Omit<T, K>:从 T 中排除部分属性

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
// Omit<User, 'password'> → 不包含 password

5. Record<K, V>:构建键值对对象类型

type Record<K extends keyof any, V> = { [P in K]: V };
// Record<'GET' | 'POST', string> → { GET: string; POST: string }

6. Exclude<T, U>:从联合类型中排除

type Exclude<T, U> = T extends U ? never : T;
// Exclude<'a' | 'b' | 'c', 'a' | 'b'> → 'c'

7. ReturnType:提取函数返回值类型

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;
// ReturnType<typeof fetch> → Promise<Response>

其他工具类型

  • Parameters<T> — 提取函数参数类型元组
  • NonNullable<T> — 排除 null 和 undefined
  • Extract<T, U> — 从联合中提取
  • Readonly<T> — 所有属性只读
  • InstanceType<T> — 构造函数实例类型