TypeScript中返回never的函数未豁免Getter返回值要求的咨询
TypeScript Getter调用never函数的报错问题
问题复现
以下代码会触发TypeScript错误提示A 'get' accessor must return a value.(2378):
declare const error: () => never; const o = { get p() { error(); } };
TypeScript 3.7的never函数优化
TypeScript 3.7版本对返回never类型的函数做了控制流分析优化:普通函数里如果路径末尾调用了never类型的函数,编译器会判定这个路径不会继续执行,允许省略显式return语句,比如下面的代码可以正常运行:
const error1 = () => { throw new Error(); }; const error2: () => never = error1; const f: () => number = () => { if (Math.random() > 0.5) return 0; error2(); };
为什么相同逻辑不适用于Getter?
这是因为TypeScript对Getter的返回值检查逻辑和普通函数不一致。Getter被设计为必须返回对应类型的值,即便你调用了never函数(意味着永远不会正常返回),编译器当前的规则仍然要求显式写出return语句。而普通函数的控制流分析在3.7后更新了对never的处理,但Getter的控制流分析逻辑并未同步跟进这个优化。
临时解决方案与官方进展
目前可以通过显式写return error()来规避报错——因为返回never类型的表达式符合Getter的返回要求(never可以赋值给任何类型)。
官方已经注意到这个不一致性,在TypeScript的官方仓库中有相关特性讨论和开放议题,团队正在评估是否将never函数的控制流分析优化扩展到Getter场景,但目前还没有正式的修复版本发布。
内容的提问来源于stack exchange,提问作者Doofus
相关产品推荐
相关产品推荐

