es-toolkit 的 omit 函数按指定键剔除对象属性并保持类型安全【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit导读omit是 es-toolkit 对象工具集中最常用的函数之一它的作用是从对象中剔除指定键对应的属性并返回一个全新的对象。本篇文章围绕 es-toolkit 官方文档中omit的说明展开结合 源码实现 与 单元测试带你掌握omit的调用方式、TypeScript 类型推导、底层原理以及与pick、omitBy、lodash 兼容版omit的异同读完即可在项目中安全、高效地使用它。omit 是什么omit用于按黑名单剔除传入一个对象和一组键名返回一个剔除了这些键对应属性的新对象。原始对象不会被修改。const result omit(obj, keys);es-toolkit 的omit位于对象工具模块中可以通过 src/object/index.ts 中export { omit } from ./omit.ts的声明随主入口一起导出也可以按官方文档推荐的方式按需导入。基本用法剔除指定键import { omit } from es-toolkit/object; // 剔除指定键 const obj { a: 1, b: 2, c: 3, d: 4 }; const result omit(obj, [b, c]); // result 为 { a: 1, d: 4 }不存在的键不会报错// 指定不存在的键也不会抛错 const safe omit(obj, [b, nonexistent]); // safe 为 { a: 1, c: 3, d: 4 }从 实现 可以看到omit只是对每个键执行delete操作因此键不存在时删除是空操作天然安全不需要额外的存在性判断。原始对象不被修改omit返回的是浅拷贝后的新对象内部通过展开运算符{ ...obj }创建因此对返回结果的修改不会影响原对象这一点同样有 单元测试 的保障。参数与返回值参数objT extends Recordstring, any需要剔除键的对象。keysreadonly K[]要从对象中剔除的键名数组。返回值返回类型为OmitT, K即剔除了K中全部键后的新对象类型。这意味着 TypeScript 会在编译期就阻止你访问已经被剔除的属性让剔除在类型层面同样生效。interface User { id: number; name: string; password: string; } const user: User { id: 1, name: alice, password: secret }; const publicUser omit(user, [password]); // publicUser 的类型为 OmitUser, password即 { id: number; name: string } // publicUser.password 在编译期会报错源码实现为什么它又快又小es-toolkit 的定位是比 lodash 更快、打包体积更小官方文档表述为在现代 JavaScript 环境下性能提升 2~3 倍、体积最多缩小 97%omit的实现正是这一理念的缩影。完整实现见 src/object/omit.tsexport function omitT extends Recordstring, any, K extends keyof T( obj: T, keys: readonly K[] ): OmitT, K { const result { ...obj }; for (let i 0; i keys.length; i) { const key keys[i]; delete result[key]; } return result as OmitT, K; }几个值得注意的实现细节一次浅拷贝 循环 delete先用展开运算符生成拷贝再逐个delete待剔除的键时间复杂度为O(n m)n 为对象属性数m 为待剔除键数没有多余的中间对象也没有依赖外部工具函数非常适合被 tree-shaking 完整消除未用代码。readonly K[]参数类型层面允许传入只读数组兼容as const声明的常量数组同时保证调用方不会被强制修改传入数组。as OmitT, K断言运行时的delete无法被 TypeScript 静态追踪因此实现尾部用类型断言把{ ...obj }的结果收窄为OmitT, K保证对外暴露的类型签名精确。测试用例解读src/object/omit.spec.ts 使用 vitest 覆盖了omit的核心行为正常剔除omit({ foo: 1, bar: 2, baz: 3 }, [foo, bar])结果为{ baz: 3 }全部剔除omit(obj, [a, b, c])返回空对象{}不剔除任何键传入空数组[]时返回与原对象等值的新对象不修改原对象剔除b后原对象仍保持{ a: 1, b: 2, c: 3 }。这四个用例分别对应正常路径、边界路径、空输入、副作用防护如果你的项目中对omit做了二次封装可以参照这组用例设计自己的测试。与 pick、omitBy 的搭配使用omit是剔除指定键的白名单反向操作与同模块的另外两个函数形成互补pick(obj, keys)只保留指定键返回PickT, K类型。实现上通过Object.hasOwn判断键是否存在后逐个拷贝见 src/object/pick.ts。需要显式选择少量字段如 API 响应裁剪时用它语义更清晰。omitBy(obj, shouldOmit)不按键名、而是按条件函数剔除属性返回PartialT。条件函数接收(value, key)两个参数返回true则剔除见 src/object/omitBy.ts。当剔除规则是动态的如剔除所有字符串值而非固定键名时使用。实际项目中常组合使用先用pick选出安全字段白名单或用omit快速剔除敏感字段如密码、token需要更复杂的规则时再升级为omitBy。进阶lodash 兼容版 omit 的深度路径能力如果你从 lodash 迁移过来需要注意 es-toolkit 在 src/compat/object/omit.ts 中提供了与 lodash 行为对齐的兼容版本它通过es-toolkit/compat入口暴露支持普通版omit不具备的能力可变参数形式omit(obj, a, b)或omit(obj, a, [b, c])键可以打散传入深度路径支持a.b或[a, b]形式的嵌套路径剔除如omit({ a: { b: 1, c: 2 }, d: 3 }, a.b)结果为{ a: { c: 2 }, d: 3 }Symbol 键与继承属性内部通过keysIn与getSymbolsIn收集可枚举键含继承属性与 symbol见 shallowCloneInOmitnull/undefined 容错obj null时直接返回{}深度剔除时的深拷贝当检测到深度路径时会改用cloneDeepWith对普通对象做深拷贝后再剔除避免浅拷贝共享引用导致原对象被误改见 deepCloneInOmit。选择建议日常业务代码推荐使用es-toolkit/object的轻量版omit类型更直接、体积更小需要与 lodash 逐字节对齐深度路径、可变参数时再从es-toolkit/compat引入兼容版。常见问题与使用注意omit是浅拷贝嵌套对象数组、普通对象的引用会被原样保留。若需要深拷贝后剔除请使用兼容版的深度路径能力或先cloneDeep再omit。键必须是可枚举字符串属性轻量版omit通过展开运算符 delete实现不处理 symbol 键、继承属性与不可枚举属性这些场景请使用 compat 版本。空数组输入omit(obj, [])会返回一个内容相同的新对象不会报错可用于条件性剔除的代码路径。TypeScript 提示当对象类型较宽如Recordstring, any时K会被推断为string返回类型退化为OmitT, string如需精确类型建议先为对象定义明确的接口类型再调用omit。总结omit是 es-toolkit 对象工具中最简洁实用的函数之一一次展开拷贝加循环delete换来 O(nm) 的时间复杂度、无需外部依赖的极小组件体积以及OmitT, K带来的编译期类型安全。配合 源码、单元测试 与 lodash 兼容版 src/compat/object/omit.ts 一起阅读可以完整覆盖从日常剔除到深度路径迁移的全部场景。需要反向保留指定键时别忘了同模块的 pick 与按条件剔除的 omitBy。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?