Skip to content

TS 中的 Omit、Pick、Exclude 和 Extract #80

@inkjuncom

Description

@inkjuncom

一、核心对比表

工具类型 作用对象 核心操作 典型场景 示例
Omit<T, K> 对象类型 排除指定属性 移除对象中不需要的属性 Omit<User, 'id'> → 移除 id 属性
Pick<T, K> 对象类型 选取指定属性 提取对象中需要的属性 Pick<User, 'name'> → 仅保留 name
Exclude<T, U> 联合类型 排除匹配类型 过滤联合类型中的无效成员 Exclude<1|'a', string>1
Extract<T, U> 联合类型 提取匹配类型 筛选联合类型中的有效成员 Extract<1|'a', string>'a'

二、核心区别

  1. 操作维度不同
  • 对象维度OmitPick 操作对象类型的属性
  • 联合类型维度ExcludeExtract 操作联合类型的成员
  1. 行为互补
  • OmitPick:互为反向操作(排除属性 vs 选择属性)
  • ExcludeExtract:互为反向操作(排除类型 vs 选择类型)
  1. 实现依赖
// Omit 依赖 Exclude 和 Pick
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;

// Exclude 和 Extract 基于条件类型
type Exclude<T, U> = T extends U ? never : T;
type Extract<T, U> = T extends U ? T : never;

三、组合使用示例

  1. 动态生成对象键
interface Config {
  apiUrl: string;
  timeout: number;
  retry: boolean;
}

// 排除非字符串键 → 提取字符串类型的键
type StringKeys = Extract<keyof Config, string>; // 'apiUrl' | 'timeout' | 'retry'
type StringConfig = Pick<Config, StringKeys>;    // 等效 Config 本身
  1. 安全类型过滤
type UserResponse = {
  id: string;
  name: string;
  passwordHash: string;
};

// 排除敏感字段(Omit) + 提取非函数类型(Extract)
type SafeUser = Omit<UserResponse, 'passwordHash'>;
type SafeKeys = Extract<keyof SafeUser, string>; // 'id' | 'name'

四、一句话总结

  • 操作对象属性:用 Omit(排除)或 Pick(选择)
  • 操作联合类型:用 Exclude(排除)或 Extract(提取)
  • 组合使用keyof T + Exclude/Extract 可实现维度转换,处理复杂类型逻辑

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions