如何在TypeScript中编写通用的omit函数?
TypeScript 通用 omit 函数实现优化
你的代码思路方向没问题,但循环过滤的逻辑存在缺陷:当okeys包含多个元素时,只要有一个过滤键和当前对象键不相等,就会执行赋值操作——这会导致同一个键被重复赋值,而且如果当前键本身就在待剔除列表里,只要有其他过滤键和它不等,还是会错误保留该键。
下面是修正后的实现,同时提供几种更简洁的写法:
修正原逻辑的版本
function omit<T, P extends keyof T>(obj: T, okeys: P[]): Omit<T, P> { return (Object.keys(obj) as Array<keyof T>).reduce((newObj, key) => { // 直接判断当前键是否不在待剔除列表中,逻辑更清晰 if (!okeys.includes(key as P)) { newObj[key] = obj[key]; } return newObj; }, {} as Omit<T, P>); }
基于对象解构的简洁版本
利用对象解构忽略指定键的特性,实现更直观:
function omit<T, P extends keyof T>(obj: T, okeys: P[]): Omit<T, P> { // 构造一个包含待剔除键的占位对象 const omitMap = okeys.reduce((acc, key) => { acc[key] = undefined; return acc; }, {} as Record<P, undefined>); // 合并后解构,自动忽略待剔除键 const { ...rest } = { ...obj, ...omitMap }; return rest; }
先筛选保留键的版本
先找出所有需要保留的键,再构建新对象,可读性更强:
function omit<T, P extends keyof T>(obj: T, okeys: P[]): Omit<T, P> { const keepKeys = (Object.keys(obj) as Array<keyof T>).filter( key => !okeys.includes(key as P) ); return keepKeys.reduce((acc, key) => { acc[key] = obj[key]; return acc; }, {} as Omit<T, P>); }
类型说明
- 泛型
T约束输入对象的类型,P约束为T的键集合,确保传入的okeys都是对象实际存在的属性,避免类型错误。 - 返回值使用
Omit<T, P>类型,准确描述剔除指定属性后的对象结构,保证类型安全。
内容的提问来源于stack exchange,提问作者Makaraju Bhanu prathyusha
相关产品推荐
相关产品推荐

