omit和pick是typescript中用于类型裁剪的内置工具类型:pick通过“白名单”选取指定属性(如pick),omit通过“黑名单”排除指定属性(如omit),二者均不修改原类型,而是生成新类型,适用于api响应、表单验证等场景。

Omit 和 Pick 是 TypeScript 里最常用的两个类型裁剪工具,它们不修改原类型,而是基于它“算出”一个新类型——一个只保留你需要的字段,另一个只去掉你不想要的字段。
什么时候用 Pick:明确要留哪些字段
Pick 是“白名单”思路,适合字段少、目标明确的场景。比如表单提交只需要 id 和 name,其他几十个字段都无关:
- 语法是 Pick
- 字段名必须是原始类型中真实存在的键,否则报错
- 可选属性(
name?: string)和只读修饰符(readonly id: number)都会被原样保留
示例:
interface User {
id: number;
name: string;
email: string;
password: string;
createdAt: Date;
}
type IdNameOnly = Pick<user>;
// 等价于 { id: number; name: string; }
</user>
什么时候用 Omit:明确要删哪些字段
Omit 是“黑名单”思路,适合大部分字段都要保留、只剔除个别敏感或冗余字段的情况。比如用户详情页展示时,总不能把 password 和 refreshToken 暴露出去:
- 语法是 Omit
- 排除多个字段就用联合类型写法,比如
'password' | 'refreshToken' - 即使原始类型里没有某个被排除的字段名,TypeScript 也不会报错(静默忽略)
示例:
type UserProfileView = Omit<user>;
// 等价于 { id: number; name: string; email: string; }
</user>
两者可以组合使用,应对复杂裁剪
单独用 Pick 或 Omit 解决不了所有问题,但组合起来就很灵活。比如先用 Omit 去掉敏感字段,再用 Pick 挑出前端真正需要渲染的几个:
-
Omit
→ 得到安全版 User -
Pick
, 'id' | 'name' | 'email'> → 再精简成列表页所需结构 - 也可以嵌套在泛型函数、组件 Props 类型定义中,避免重复声明
实际开发中几个关键提醒
这些细节容易踩坑,但影响类型安全:
- 字段名要用字符串字面量,不能是变量;
Omit<user keyof user></user>会得到空对象类型,不是你想要的 - Omit 的第二个参数支持任意字符串联合,哪怕字段不存在也不报错;Pick 则严格校验字段是否属于原始类型
- 和 Partial、Required 等工具类型配合很常见,比如
Omit<user> & Partial</user>表示 id 可选但其他字段必填










