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

为何TypeScript会将对象按键引用的属性判定为never类型?

TypeScript:赋值any类型到keyof对象属性触发never类型错误的原因与解决

问题场景

下面的代码中,我们试图将any类型的值赋值给对象中由keyof TypeAObject指定的属性,但TypeScript返回错误,提示目标属性类型为never:

type TypeAObject = {
  'first': string;
  'second': string;
  'third': number;
}

const assignKeyValue = (key: keyof TypeAObject, obj: TypeAObject, value: any) => {
  obj[key] = value; // Error: Type 'any' is not assignable to type 'never'.
}

错误提示如下:

Error: Type 'any' is not assignable to type 'never'.

原因解析

TypeScript在这里会对obj[key]的类型进行严格推导:key可以指向first/second(对应string类型)或third(对应number类型)。由于TypeScript无法确定当前key具体指向哪一个属性,它会取所有可能属性类型的交集。而string和number的交集是never——没有任何值能同时属于string和number类型,因此哪怕传入any类型,也会触发赋值错误。

解决方案

方案1:用泛型约束实现类型安全(推荐)

通过泛型让key和value的类型绑定,TypeScript就能准确推断出对应属性的类型,既解决错误又保证类型安全:

type TypeAObject = {
  'first': string;
  'second': string;
  'third': number;
}

const assignKeyValue = <K extends keyof TypeAObject>(key: K, obj: TypeAObject, value: TypeAObject[K]) => {
  obj[key] = value; // 无错误,且类型校验生效
}

调用时,传入的value会自动匹配key对应的属性类型:比如传key="third"时,value必须是number类型。

方案2:类型断言绕过检查(不推荐)

如果确实需要使用any类型且暂时忽略类型检查,可以用类型断言强制赋值:

const assignKeyValue = (key: keyof TypeAObject, obj: TypeAObject, value: any) => {
  (obj[key] as any) = value;
}

这种方式会关闭该位置的类型校验,可能隐藏潜在的类型错误,仅在特殊场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:42:46