如何用TypeScript将大对象映射到小型接口并剔除冗余字段?
如何过滤TypeScript对象只保留接口定义字段存入IndexedDB?
我太懂你这个困扰了——TypeScript的类型断言(不管是as smallerInterface还是<smallerInterface>写法)完全不会改变运行时的对象结构,它只是给编译器看的类型提示而已,所以那些lorem、dolor这类接口外的字段肯定还会跟着走。要真正把冗余字段去掉,得从运行时处理入手,下面给你几个不用手写全量映射函数的实用方案:
方案1:通用字段提取函数(最推荐)
写一个复用性极强的小工具函数,利用TypeScript的keyof操作符来自动匹配目标接口的字段,不用为每个接口单独写映射逻辑:
export interface smallerInterface { ipsa: number[]; elit: any[]; } // 通用提取函数:只保留目标接口指定的字段 function pick<T>(sourceObj: any, allowedKeys: Array<keyof T>): T { return allowedKeys.reduce((filteredObj, key) => { if (sourceObj.hasOwnProperty(key)) { filteredObj[key] = sourceObj[key]; } return filteredObj; }, {} as T); } // 使用示例 const fullObject = { lorem: 1, ipsa: [2,3], dolor: { sit: 'amet', consectetur: 'adipiscing'}, elit: [{you: 'get'}, {the: 'picture'}] }; const filteredObj = pick<smallerInterface>(fullObject, ['ipsa', 'elit']); // 现在filteredObj就只剩ipsa和elit两个字段,直接存IndexedDB就行
这个函数的好处是,TypeScript会帮你校验传入的allowedKeys是不是目标接口里的字段,避免写错,而且不管接口有多少字段,只要传对键数组就行,不用手动写每个属性的赋值。
方案2:用类替代接口做转换
如果你的场景允许把接口改成类,可以借助构造函数+Object.assign来自动过滤:
export class smallerClass { ipsa: number[]; elit: any[]; constructor(sourceObj: Partial<smallerClass>) { // Object.assign只会复制类中定义的属性,冗余字段会被自动忽略 Object.assign(this, sourceObj); } } // 使用示例 const filteredObj = new smallerClass(fullObject);
这个方法适合字段结构不复杂的场景,代码量也很小。
方案3:ES6解构快速提取(适合字段少的接口)
如果你的接口只有几个字段,直接用解构语法也很方便,虽然看起来像手动映射,但其实代码非常简洁:
const { ipsa, elit, ...unusedFields } = fullObject; const filteredObj = { ipsa, elit } as smallerInterface;
这里的unusedFields会包含所有冗余字段,但我们直接忽略它就行,最终的filteredObj就是符合接口要求的结构。
最后要提醒一句:TypeScript的类型信息在编译后会被完全擦除,所以它本身没办法在运行时自动过滤字段,必须通过上面这些运行时的代码逻辑来处理。
内容的提问来源于stack exchange,提问作者StuperUser
相关产品推荐
相关产品推荐

