为何索引对象无法赋值?TypeScript `never`类型报错解析
关于TypeScript报错
Type 'any' is not assignable to type 'never'.(2322)的解释 问题场景
以下代码的最后一行出现上述报错,核心疑问是never类型的来源:
type TypeA = { a: string; b: number; } const data = undefined as unknown as TypeA; // 此处value的类型为string | number,无问题 const value = data['a' as keyof TypeA]; // 此行报错:Type 'any' is not assignable to type 'never'.(2322) data['a' as keyof TypeA] = undefined as any;
报错原因解析
这个never类型来自TypeScript对联合索引赋值的严格类型检查规则:
- 当你使用
keyof TypeA(即'a' | 'b'这个联合类型)作为索引去赋值时,TypeScript要求你赋的值必须能同时满足所有索引对应的属性类型。 - TypeA中
'a'对应string类型,'b'对应number类型,这两个类型的交集是never(没有任何值能同时既是string又是number)。 - 因此TypeScript推断出这个索引赋值的目标类型是
never,而你赋值的any类型无法匹配never,就触发了报错。
而取值时不会有这个问题:取值时联合索引对应的是属性类型的联合(string | number),只要值属于其中一种类型即可,和赋值的规则完全不同。
解决方法
如果需要完成这类赋值,可以通过两种方式规避:
- 直接指定具体的键,避免使用联合索引:
data['a'] = undefined as any; - 通过类型断言跳过TypeScript的严格检查(仅在你明确知道操作安全时使用):
(data as any)['a' as keyof TypeA] = undefined as any;
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

