Omit<T, K>
最后更新:2026-10-22
Omit<T, K> Omit
Omit<T, K> 从 T 中"剔除"K 指定的属性,剩下的组成新类型。典型场景是脱敏(去掉 passwordHash)、把数据库行转成对外响应。它与 Pick 方向相反:字段多要剔除的少时,Omit 更省事。
| 分组 | 工具类型 |
|---|---|
| 类型 | 类型 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type Omit<T, K extends string | number | symbol> =
Pick<T, Exclude<keyof T, K>>;
// 用法
type PublicAccount = Omit<Account, "passwordHash" | "twoFA">;
⚙️ 参数
| T | 源对象类型,属性从这里剔除 |
|---|---|
| K | 要剔除的键的联合;注意 K 不要求必须是 T 的键,写错的键名会被静默忽略 |
返回值:一个新类型:含 T 中除 K 之外的全部属性,类型保持一致。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
{"username":"carol","email":"carol@example.com"}
(转译后运行输出;实现里用解构 rest 剔除敏感字段,类型上 PublicAccount 已不含 passwordHash——若拼写错误写成 Omit<Account, "passwordHash2">,敏感字段不会被剔除)
💡 要点
ℹ️ 说明 实现是组合技:Omit<T, K> = Pick<T, Exclude<keyof T, K>>——先用 Exclude 从键联合里剔除 K,再 Pick 剩下的。
⚠️ 注意 K 不校验是否为 T 的键:Omit<Account, "passwordHashh">(多打一个字母)不报错,敏感字段原样保留。涉及安全脱敏时,建议改用严格版:type StrictOmit<T, K extends keyof T> = Omit<T, K>。
💡 提示 Omit 是黑名单:之后给 Account 新增的字段会自动出现在 Omit 结果里。这正是它适合"对外暴露全部、只藏少数"场景的原因。
🏷️ 相关工具类型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q Omit 和 Pick 到底选哪个?
A 看意图:"只要这几个"用 Pick(白名单,字段少时清晰);"去掉这几个"用 Omit(黑名单,之后源类型加字段不用改)。安全性要求高的脱敏场景,Pick 更稳(键名拼错会报错)。
Q 为什么 Omit 不像 Pick 那样校验键名?
A 官方实现的 K extends string | number | symbol 故意放宽,以便支持对不确定形状的类型做剔除。这个宽松是双刃剑:灵活,但拼错键名静默失效。要严格可以一行自定义 StrictOmit。
Q 运行时怎么真正去掉属性?
A Omit 只改类型。运行时常用解构 rest:const { passwordHash, ...rest } = account; 或 delete account.passwordHash(严格模式下对必备属性报编译错)。解构 rest 是最推荐的方式。