TypeScript泛型索引报TS2536:string无法索引类型T,如何正确定义方法类型?
问题原因
TS2536报错的核心是三个类型不匹配问题:
- 你定义的
valueName是通用string类型,TS不会自动认为任意字符串都属于泛型T的合法索引键 Object.keys()默认返回string[]类型,同样无法直接作为T的索引使用value的类型没有和T的对应属性类型绑定,赋值时也会存在类型安全隐患
修复后的完整代码
interface TestT { [index: string]: any } // 新增泛型K约束为T的键类型 function _defaultUpdateStateMutation<T extends TestT, K extends keyof T> ( state: T, options: // 联合类型区分两种传参场景 | { value: T[K], valueName: K } | { value: Partial<T>, valueName?: undefined } ) { const { value, valueName } = options if (valueName !== undefined) { state[valueName] = value } else if (value) { // 把Object.keys返回值断言为T的键数组,解决索引类型问题 (Object.keys(value) as (keyof T)[]).forEach(valueName => { state[valueName] = value[valueName] }) } }
核心改动说明
- 新增泛型参数
K extends keyof T,把valueName的类型从通用string收敛为T的合法键类型,保证索引合法性 - 用联合类型拆分options的两种传参场景:传
valueName时value对应T[K]类型,不传时value是Partial<T>类型,保证赋值的类型安全 - 将
Object.keys(value)的返回值显式断言为(keyof T)[],让TS认可遍历出的键可以作为T的索引使用
内容的提问来源于stack exchange,提问作者volna
相关产品推荐
相关产品推荐

