You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:05:04