TypeScript中使用Omit生成新接口后转换数据时如何移除多余属性
问题根因
TypeScript 的类型系统是编译时的结构类型系统,你用Omit工具类型只是在类型定义层面移除了pga属性的类型声明,没有对运行时的实际对象做任何修改。因为Original类型完全包含OriginalPartial要求的所有属性,符合结构兼容规则,所以赋值不会触发类型错误,但运行时原始对象上的pga属性依然存在。
原生实现方案(无需第三方库)
方案1:解构丢弃指定属性(最推荐,性能最好)
直接在赋值时解构出要丢弃的属性,剩余属性自动构成目标对象,同时TS会自动推导正确的类型:
// 单条数据处理 const { pga, ...neededData } = originalData[0]; // 可以手动标注类型,也可以依赖TS自动推导 const neededDataWithType: OriginalPartial = neededData; // 批量处理整个数组 const neededDataList: OriginalPartial[] = originalData.map(({ pga, ...rest }) => rest);
这种方式生成的新对象天然没有pga属性,不需要额外操作。
方案2:实现通用omit工具函数
如果要丢弃的属性较多,可以自己实现一个原生的泛型omit函数,功能和lodash.omit一致:
function omit<T extends object, K extends keyof T>(obj: T, keysToRemove: K[]): Omit<T, K> { // 先浅拷贝原对象,避免修改原始数据 const newObj = { ...obj }; keysToRemove.forEach(key => delete newObj[key]); return newObj; } // 使用示例 const neededData = omit(originalData[0], ['pga']); const neededList = originalData.map(item => omit(item, ['pga']));
这种方式适合需要动态指定要移除属性的场景。
补充说明
如果你之前直接标注类型后还能访问pga且TS不报错,大概率是你的TS配置开启了suppressImplicitAnyIndexErrors或者使用了类型断言绕过了检查,按照上述两种方案处理后,无论是编译时类型检查还是运行时的实际对象,都不会再出现pga属性。
内容的提问来源于stack exchange,提问作者hatch
相关产品推荐
相关产品推荐

