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

TypeScript无法正确推断类型?递归清理对象函数类型报错求助

问题分析与解决

你遇到的TS2322: Type 'object' is not assignable to type 'never'错误,本质是类型断言和泛型处理的逻辑漏洞导致的,和TypeScript本身无关,下面拆解原因并给出修正方案:

错误根源

  1. 错误的键类型断言:你用key as keyof object把键的类型限定为object的通用键,但newInstance是T类型的实例,TypeScript无法将宽泛的object类型值赋值给T的具体属性,最终触发类型不兼容错误。
  2. 递归泛型约束过宽:显式指定clearObject<object>(...)强制返回object类型,但newInstance[key]的实际类型是T属性的子类型,两者无法匹配。
  3. typeof判断未排除null:typeof null === 'object',如果属性值是null,会误触发递归,同时干扰类型推断。
  4. 返回值逻辑错误:你修改的是newInstance,但最后返回的是原obj,这不仅逻辑错误,也会让TypeScript的类型推断混乱。

修正后的代码

function clearObject<T extends object>(obj: T): T {
    const newInstance = { ...obj };
    // 断言keys为T的属性键数组,明确类型关联
    const keys = Object.keys(newInstance) as Array<keyof T>;

    keys.forEach(key => {
        const value = newInstance[key];

        if (typeof value === 'function') {
            return;
        }

        // 排除null,只处理真正的对象类型
        if (value !== null && typeof value === 'object') {
            // 让TS自动推断子类型,确保赋值类型匹配
            newInstance[key] = clearObject(value) as typeof value;
        }
    });

    // 返回修改后的实例,而非原对象
    return newInstance;
}

核心修正说明

  • 把Object.keys的结果断言为Array<keyof T>,让TypeScript明确键和newInstance属性的对应关系,避免类型丢失。
  • 递归时不手动指定泛型参数,让TypeScript自动推断子属性的类型,再通过as typeof value确保赋值时类型完全匹配。
  • 增加value !== null判断,排除null的干扰,让类型推断更准确。
  • 返回修改后的newInstance,保证函数逻辑和类型的一致性。

内容的提问来源于stack exchange,提问作者jacob_frankovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:43:14