TypeScript中为何无法为字符串类型对象属性赋值新字符串?
问题分析
报错的核心原因是:你的泛型约束允许T包含K键,且T[K]可以是string的子类型(比如字符串字面量类型"bar")。此时T & Record<K, string>中K键的类型是T[K](子类型会覆盖父类型),而"foo"是宽泛的string类型,无法赋值给更具体的T[K]。
解决方案
调整函数签名,通过Omit<T, K>移除T中K键的原有类型定义,再与Record<K, string>合并,强制K键的类型为string,赋值操作即可正常进行:
const setAndGetString = <K extends string, T extends Record<string, any>>( obj: Omit<T, K> & Record<K, string>, key: K ): string => { obj[key] = "foo"; // 不再报错 return obj[key]; };
原理说明
Omit<T, K>:剔除T类型中K对应的键值对,消除T[K]的具体子类型限制。Omit<T, K> & Record<K, string>:重新为K键指定string类型,确保赋值的"foo"(string类型)与目标类型完全兼容。
如果希望严格限制T原本不包含K键,也可以将T的约束改为T extends Omit<Record<string, any>, K>,效果一致:
const setAndGetString = <K extends string, T extends Omit<Record<string, any>, K>>( obj: T & Record<K, string>, key: K ): string => { obj[key] = "foo"; return obj[key]; };
内容的提问来源于stack exchange,提问作者Steven Noble
相关产品推荐
相关产品推荐

