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 是最推荐的方式。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏