TypeScript 工具类型实战:Pick、Omit 与其他利器

Pick 选子集、Omit 排除字段、Partial 全可选……内置工具类型消灭重复类型定义。本文通过表单场景实战讲解核心工具类型。

最佳实践
类型结构与组件组合插画

工具类型从现有类型派生新类型而非重复定义:Pick<User, 'name'> 取子集、Omit<User, 'password'> 排除字段、Partial<User> 全可选。基础类型变更时派生类型自动同步——类型系统也 DRY。

类型重复的问题

interface User { id: number; name: string; email: string; password: string; }

// 笨办法:为"表单输入"再定义一遍——User 加字段它就漂移
interface UserForm { name: string; email: string; password: string; }

Pick 与 Omit

// Pick:选取子集
type UserPreview = Pick<User, 'id' | 'name'>;

// Omit:排除字段
type UserForm = Omit<User, 'id'>;          // 表单不需要 id
type PublicUser = Omit<User, 'password'>;  // 对外脱敏

表单实战

type CreateUserForm = Omit<User, 'id'>;
type UpdateUserForm = Partial<CreateUserForm>;   // 更新时全可选

function validate(form: CreateUserForm): string[] {
  // 类型驱动:User 加了必填字段,这里编译报错提醒补校验
}

必备工具类型速查

工具 作用
Partial<T> 全可选
Required<T> 全必填
Readonly<T> 全只读
Record<K, V> 键值映射
Pick<T, K> / Omit<T, K> 取子集 / 排除
Exclude<T, U> / Extract<T, U> 联合类型排除 / 提取
ReturnType<F> / Parameters<F> 函数返回 / 参数类型
Awaited<T> 解包 Promise
NonNullable<T> 去 null/undefined

组合模式

// API 响应:基础实体 + 分页包装
type Paginated<T> = { items: T[]; total: number; page: number };
type UserPage = Paginated<PublicUser>;

// 从函数签名取类型,杜绝手写同步
type FetchResult = Awaited<ReturnType<typeof fetchUsers>>;

常见问题(FAQ)

Q:Omit 和 Pick 怎么选?

"要少数"用 Pick(白名单),"排少数"用 Omit(黑名单)。演化稳定性不同:基础类型加字段时 Omit 自动包含新字段,Pick 不变——按语义选。

Q:工具类型会影响运行时吗?

不会——纯编译期概念,零运行时成本。

Q:自定义工具类型?

工具类型就是泛型 + 映射/条件类型——掌握本系列《映射类型》《条件类型》后可自建项目专属工具集。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台