如何改写TypeScript扁平化嵌套对象函数以消除TS错误并移除父键前缀
解决方案:扁平化嵌套对象(无父键前缀+消除TS错误)
直接上适配需求的最终代码:
type FlattenedObject = Record<string, unknown>; const flattenObj = (obj: Record<string, unknown>): FlattenedObject => { const result: FlattenedObject = {}; for (const key in obj) { // 过滤原型链属性,解决TS的for...in检查错误 if (obj.hasOwnProperty(key)) { const value = obj[key]; // 仅处理非数组、非null的对象类型 if (typeof value === 'object' && value !== null && !Array.isArray(value)) { // 递归扁平化嵌套对象,直接合并键值对到结果,不添加父键前缀 const nestedFlattened = flattenObj(value as Record<string, unknown>); Object.assign(result, nestedFlattened); } else { // 非嵌套属性直接存入结果 result[key] = value; } } } return result; }; // 测试你的示例数据 const input = { "status": 1, "data" : { "name": "Tank", "dimensions": "2.0 x 2.5 x 4.0" } }; console.log(flattenObj(input)); // 输出:{ status: 1, name: 'Tank', dimensions: '2.0 x 2.5 x 4.0' }
关键修改说明:
- 解决TS错误:在
for...in循环里加obj.hasOwnProperty(key)判断,确保只遍历对象自身的属性,排除原型链上的继承属性,符合TS的严格检查规则。 - 去掉父键前缀:放弃原代码中拼接父键的逻辑,改用
Object.assign直接把嵌套对象扁平化后的键值对合并到结果中,直接保留嵌套字段的原键名。 - 边界处理:增加
value !== null判断,避免把null误判为对象导致递归错误;同时排除数组类型,防止把数组也拆解。 - 类型安全:添加TS类型定义,明确函数的输入输出类型,避免隐式类型转换的潜在问题。
注意点:
如果嵌套层级中出现同名键,后处理的键会覆盖先处理的(比如外层和data里都有status,最终结果会取data中的值)。如果需要处理这种冲突,可以根据业务需求调整逻辑(比如保留外层值、添加区分前缀等)。
内容的提问来源于stack exchange,提问作者Mtullis
相关产品推荐
相关产品推荐

