TypeScript启用strict模式时,为何never类型对象索引访问无报错?
问题:never类型的索引访问与点访问为何报错不同?
在tsconfig.json启用strict模式时,TypeScript编译器对never类型对象使用索引访问(如mystery['foo'])不报错,但点访问(如mystery.foo)却提示“Property 'foo' does not exist on type 'never'”。代码示例如下:
const mystery = ({ foo: 1 } as never) console.log(mystery['foo']) // 无报错 console.log(mystery.foo) // 类型“never”上不存在属性“foo”。 export {}
原因分析
这是TypeScript类型系统对never类型的两种访问方式做了差异化处理导致的:
点访问的严格校验逻辑:点访问(
.)会直接校验目标类型是否明确包含该属性。never类型代表“不存在任何可能的值”,TypeScript会严格断言它没有任何属性,因此点访问mystery.foo会直接抛出属性不存在的错误。索引访问的特殊兼容设计:索引访问(
[])在TypeScript的类型逻辑中,被设计为对“可能包含任意属性”的类型具备更强兼容性。对于never类型,编译器认为既然它代表不可能存在的值,索引访问的操作本身永远不会被执行,因此不会触发错误——这种设计是为了兼容极端场景下的类型断言代码,避免不必要的报错阻塞编译。
本质上,TypeScript对never类型的点访问做了严格的属性存在性校验,而索引访问则因语法灵活性被赋予“跳过校验”的特殊处理,毕竟never类型的值根本不会实际存在,对应的访问代码永远不会运行。
内容的提问来源于stack exchange,提问作者Croad Langshan
相关产品推荐
相关产品推荐

