TypeScript中如何遍历不同类型嵌套对象的值且不使用any
TypeScript遍历不同类型嵌套对象的解决方案
在TypeScript中,当嵌套对象的子对象类型不同时,直接遍历会遇到类型推断为never的问题,比如你给出的代码:
const obj = { a: { foo: 123, bar: 456 }, b: { gg: 789 } } let key: keyof typeof obj for (key in obj) { const subobj = obj[key]; let subkey: keyof typeof subobj; for (subkey in subobj) { subobj[subkey] = 100; } }
报错原因是:obj[key]的类型是联合类型{foo: number; bar: number} | {gg: number},keyof联合类型会取各子类型键的交集,而这两个子对象没有共同键,所以subkey被推断为never,进而导致赋值时类型不兼容。
以下是两种不用any的解决方法:
方法一:用泛型函数封装子对象处理逻辑
通过泛型让TypeScript为每个子对象单独推断类型,避免联合类型的限制:
const obj = { a: { foo: 123, bar: 456 }, b: { gg: 789 } } function updateSubObject<T extends Record<string, number>>(subobj: T) { for (const subkey in subobj) { subobj[subkey] = 100; } } for (const key in obj) { updateSubObject(obj[key]); }
泛型函数updateSubObject会针对每个具体的子对象类型进行处理,TypeScript能正确识别子对象的键和值类型,不会出现never推断问题。
方法二:使用安全的类型断言
如果明确所有子对象的属性值都是number,可以用Record<string, number>做类型断言,比any更可控:
const obj = { a: { foo: 123, bar: 456 }, b: { gg: 789 } } for (const key in obj) { const subobj = obj[key] as Record<string, number>; for (const subkey in subobj) { subobj[subkey] = 100; } }
这里的断言是安全的,因为我们清楚所有子对象的属性值都是数字类型,不会破坏类型安全。
内容的提问来源于stack exchange,提问作者weeb
相关产品推荐
相关产品推荐

