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

TypeScript通用属性设置泛型函数报ts2322错误如何解决

报错原因

T extends Record<string, string> 仅表示泛型T满足Record<string, string>的结构约束,不代表T的所有属性值类型都是通用string。你可以传入属性为更窄的字符串字面量类型的对象,比如:

const user = { id: "123" } as const;
// 此时user的id类型是字面量类型"123",而非通用string

如果调用setProperty(user, "id"),按照函数逻辑需要把id赋值为"hello",但"hello"显然不能赋值给"123"类型,这就是TS抛出2322错误的根本原因:"hello"的类型string无法保证可以赋值给更窄的T[keyof T]类型。

解决方案

根据你的使用场景可以选以下三种方案:

方案1:不需要泛型直接简化

如果你的函数不需要保留入参对象的字面量类型特性,直接去掉泛型即可正常运行:

function setProperty(obj: Record<string, string>, key: string) {
  obj[key] = "hello";
}

方案2:保留泛型加类型断言

如果你确定业务逻辑里赋值"hello"是安全的,不需要限制传入字面量类型的对象,可以用类型断言绕开校验:

function setProperty<T extends Record<string, string>>(obj: T, key: keyof T) {
  obj[key] = "hello" as T[keyof T];
}

方案3:泛型层面保证类型安全

如果不想用断言,也可以调整泛型约束的写法,从类型层面保证属性值是通用string类型:

function setProperty<K extends string>(obj: Record<K, string>, key: K) {
  obj[key] = "hello";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:36:03