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
相关产品推荐
相关产品推荐

