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:自定义工具类型?
工具类型就是泛型 + 映射/条件类型——掌握本系列《映射类型》《条件类型》后可自建项目专属工具集。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。