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

TypeScript ts2536报错:string无法索引带字符串索引签名的GenericObject

TypeScript ts(2536)错误原因与解决

错误原因

你写的GenericObject extends { [k: string]: number }约束仅表示GenericObject是带字符串索引签名类型的子类型,不代表GenericObject本身允许任意字符串作为键。
举个实际场景:如果调用reduce时传入的初始值是类型为{ pass: number, reject: number }的对象,它完全符合上述extends约束,但如果传入的status是'cancel'这类不在'pass'|'reject'范围内的字符串,索引操作就会非法。TS为了规避这类风险,禁止直接用任意string类型的值索引泛型类型。

解决方案

  • 方案1:移除不必要的泛型,直接指定累加器类型
    该场景下你传入的初始值是空对象,不需要泛型继承逻辑,直接给reduce指定返回类型即可解决问题,写法更简洁:
const initialApprovalCounts = approvalStatusStrings.reduce<Record<string, number>>(
  (finalObject, status) => {
    finalObject[status] = 0
    return finalObject
  },
  {}
)
  • 方案2:保留泛型的前提下做类型断言
    如果你确实需要保留泛型约束,且能保证传入的status一定是GenericObject的合法键,可以手动做类型断言绕过检查:
finalObject[status as keyof GenericObject] = 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:07