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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:18:38