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

