禁用strictNullChecks时为何类型被推断为{}而非unknown?
TypeScript禁用strictNullChecks时的类型行为解析
先看这段代码:
const { name } = "something" as unknown;
不同模式下会出现不同的错误提示:
- 启用
strictNullChecks时,错误符合预期:Error: Property `name` does not exist on type `unknown` - 禁用
strictNullChecks时,错误提示变为:Error: Property `name` does not exist on type `{}`
这里的{}是什么含义?
这里的{}不是字面意义上的“空对象”,而是TypeScript在禁用严格空检查模式下的特殊类型,代表所有非null、非undefined的值。任何能排除这两个空值的变量,都可以被归为这个类型。
为什么推断为{}而非unknown?
这是TypeScript的设计行为:当关闭strictNullChecks时,unknown类型会被自动“放宽”处理。因为这个模式下TypeScript默认不会处理null和undefined的情况,所以会把最严格的unknown类型,降级为排除了空值的{}类型。
回到你的代码,当你把值断言为unknown后,在非严格空检查环境里,TypeScript不再以最严格的unknown规则校验,而是用{}类型来替代,所以报错时会提示{}上不存在name属性。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

