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

