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

TypeScript泛型索引报TS2536:string无法索引类型T,如何正确定义方法类型?

问题原因

TS2536报错的核心是三个类型不匹配问题:

  1. 你定义的valueName是通用string类型,TS不会自动认为任意字符串都属于泛型T的合法索引键
  2. Object.keys()默认返回string[]类型,同样无法直接作为T的索引使用
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:15:04