TypeScript错误:使用括号表示法时'string'不可赋值给'never'的原因及解决
错误原因
TypeScript 无法建立 msg.src 和 msg.value 之间的类型关联:
Message类型中,src是keyof Person(可能是"name"或"age"),value固定为string类型。- 当执行
person[msg.src] = msg.value时,TypeScript 会计算所有可能属性的类型交集:string(name的类型)和number(age的类型)的交集是never(两种类型无重叠部分),因此抛出「string无法赋值给never」的错误。
修复方案
方案1:用泛型绑定 src 和 value 的类型关联(推荐)
重新定义泛型版 Message,让 value 的类型自动匹配 src 对应的属性类型:
type Person = { name: string age: number } // 泛型K绑定src的具体属性,value类型自动对应Person[K] type Message<K extends keyof Person> = { src: K value: Person[K] } const person: Person = { name: "John", age: 30, } // 手动指定泛型 const msg: Message<"name"> = { src: "name", value: "Bob" } person[msg.src] = msg.value; // 不再报错
如果不想手动指定泛型,可以用辅助函数自动推断类型:
function createMessage<K extends keyof Person>(src: K, value: Person[K]): Message<K> { return { src, value }; } const msg = createMessage("name", "Bob"); // 自动推断K为"name",value类型为string person[msg.src] = msg.value;
方案2:使用类型断言(简单但需注意类型安全)
直接断言 msg.value 为 Person 属性的联合类型,跳过TypeScript的严格检查:
person[msg.src] = msg.value as Person[keyof Person];
⚠️ 注意:如果 msg 的 src 和 value 类型不匹配(比如src="age"但value="abc"),编译时不会报错,但运行时会出现类型错误,需谨慎使用。
方案3:用类型守卫分情况处理
通过判断 msg.src 的具体值,分别处理不同属性的赋值:
if (msg.src === "name") { person[msg.src] = msg.value; } else if (msg.src === "age") { // age是number类型,需要将string转为number person[msg.src] = Number(msg.value); }
这种方法适合属性数量较少的场景,能保证类型安全,但属性多的时候代码会冗余。
内容的提问来源于stack exchange,提问作者Hairi
相关产品推荐
相关产品推荐

