TypeScript 中,Pick 和 Omit 是两个非常常用且强大的内置工具类型(Utility Types)
TypeScript中的Pick和Omit是两个常用工具类型用于从现有类型中选取或排除属性。Pick通过白名单机制选取指定属性如从User类型中只选id和name适用于提取少量字段的场景。Omit则通过黑名单机制排除指定属性如从User中剔除id和createdAt适用于复用大部分字段的情况。两者配合能有效减少重复类型定义保持代码DRY原则常见于API响应分层、表单验证等场景通过类型运算实现数据的精确控制。在 TypeScript 中Pick和Omit是两个非常常用且强大的内置工具类型Utility Types。它们都基于泛型实现主要用于对现有的对象类型进行“重塑”即从一个复杂的类型中选取部分属性或剔除部分属性从而生成新的类型。这两个工具类型在处理 API 响应、表单数据、数据库模型映射等场景中极其高频。1.PickType, Keys定义Pick用于从类型Type中选取一组特定的属性键Keys并构造一个新的类型。新类型只包含你指定的那些属性。语法type PickType, Keys extends keyof Type { [Property in Keys]: Type[Property]; };通俗理解“我只想要这个大对象里的这几样东西。”代码示例假设我们有一个描述用户的完整类型Userinterface User { id: number; name: string; email: string; age: number; role: admin | guest; createdAt: Date; }如果我们只想在用户列表页面显示id和name不想暴露敏感信息如 email或不必要的元数据如 createdAt可以使用Pick// 只保留 id 和 name type UserListItem PickUser, id | name; // UserListItem 等价于: // { // id: number; // name: string; // } const userItem: UserListItem { id: 1, name: Alice, // error: 如果这里加上 email 或其他属性TS 会报错 };2.OmitType, Keys定义Omit用于从类型Type中剔除省略一组特定的属性键Keys并构造一个新的类型。新类型包含原类型中除了指定键以外的所有属性。语法type OmitType, Keys extends keyof any PickType, Excludekeyof Type, Keys;(注它的内部实现其实就是先算出“剩下的键”然后再用Pick选出来)通俗理解“我想要这个大对象里的所有东西除了这几样。”代码示例继续使用上面的User类型。如果在创建新用户时id和createdAt是由数据库自动生成的前端不应该传递这两个字段我们可以使用Omit// 剔除 id 和 createdAt type CreateUserInput OmitUser, id | createdAt; // CreateUserInput 等价于: // { // name: string; // email: string; // age: number; // role: admin | guest; // } const newUser: CreateUserInput { name: Bob, email: bobexample.com, age: 25, role: guest, // error: 如果这里加上 id 或 createdAtTS 会报错 };3. 核心对比总结特性PickOmit操作逻辑白名单机制只保留列出的属性黑名单机制删除列出的属性保留其余适用场景当你需要提取少量字段组成新视图时当你需要复用大部分字段仅排除少数几个字段时数学逻辑交集 (Intersection) 概念差集 (Difference) 概念内部关系基础构建块通常由PickExclude组合实现4. 实际开发中的高频用法场景 AAPI 响应分层后端返回完整的用户信息但前端不同组件需要不同的数据结构。// 完整数据 type ApiUserResponse User; // 公开个人资料页隐藏 email 和 role type PublicProfile OmitUser, email | role; // 管理员表格只需要关键标识 type AdminTableItem PickUser, id | name | role;场景 B表单验证实体类包含数据库字段但表单输入不需要某些自动生成的字段。// 数据库实体 interface Product { id: string; sku: string; price: number; stockCount: number; lastUpdated: string; } // 创建产品表单不需要 id 和 lastUpdated type CreateProductForm OmitProduct, id | lastUpdated; // 更新产品表单可能只需要部分字段可选 type UpdateProductForm PartialPickProduct, price | stockCount;总结Pick做减法从全集里挑出子集。Omit做排除从全集里去掉子集。掌握这两个工具类型可以极大地减少重复定义接口的代码量并保持类型定义与源数据模型的一致性DRY 原则。