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

TypeScript条件类型误判数组匹配字符串索引签名的报错问题

异常产生原因

TypeScript 中数组本质是特殊对象类型,这是导致判定偏差的核心原因:

  • JavaScript 运行时访问数组下标时,会自动将数字索引转为字符串处理,因此 TypeScript 的类型规则允许数字索引签名兼容字符串索引签名的约束。
  • 包括any[]在内的所有数组类型,天然满足{[k: string]: any}的结构检查,因此会被原条件类型误分到「保留原属性类型」的分支,不会走到赋值为0的逻辑分支。
  • 最终给b属性赋值0时,类型系统要求该位置必须传入any[] | undefined,和0类型不兼容,就抛出了类型错误。
修正方法

在原有条件判断前增加数组类型的优先判定,把数组类型归到需要赋值为0的分支即可,修正后的泛型定义如下:

type myType<T> = {
    [K in keyof T]?: T[K] extends (readonly any[] | undefined)
        ? 0
        : T[K] extends ({[k: string]: any} | undefined)
            ? T[K]
            : 0
}

判定逻辑中加入readonly是为了兼容只读数组类型(比如as const声明的数组、ReadonlyArray<T>类型),避免漏判。

修正后原示例代码可正常通过类型检查,普通对象属性仍会保留原类型约束,传入0时会正常抛出类型错误,符合设计预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:18:03