为函数表达式指定never返回类型无效,但函数声明有效
TypeScript函数声明与表达式的never类型流分析差异
示例代码
function foo(): never { throw new Error(); } const bar = (): never => { throw new Error(); } const qux = function():never { throw new Error(); } function mainFoo(a: number | undefined): number { if (a !== undefined) { return a; } foo(); } function mainBar(a: number | undefined): number { if (a !== undefined) { return a; } bar(); } function mainQux(a: number | undefined): number { if (a !== undefined) { return a; } qux(); }
问题现象
上述代码中,mainFoo可正常编译,但mainBar和mainQux出现错误:TypeScript提示函数缺少返回语句,且返回类型不包含undefined,仿佛将bar()和qux()的返回类型识别为undefined。

原因分析
核心差异在于TypeScript对函数声明和函数表达式赋值变量的never返回值流分析逻辑不同:
函数声明(
foo):
函数声明的类型信息在编译阶段早期就被完全解析,编译器会直接将返回never的函数声明调用标记为代码流终止点——即明确知道调用foo()后,后续代码永远不会执行。因此mainFoo中,a为undefined的分支调用foo()后,编译器判定该分支已覆盖所有情况,无需额外返回语句。函数表达式赋值变量(
bar、qux):
即便给函数表达式标注了never返回类型,变量bar/qux的类型是() => never,但调用这类变量指向的函数时,编译器不会自动将调用视为代码流终止点。此时mainBar/mainQux中,调用bar()/qux()后,编译器仍认为可能存在后续执行路径,因此要求函数必须返回number类型值,导致报错。
解决方法
只需将函数调用作为return语句的一部分,明确关联调用的never返回值与当前函数的代码流:
function mainBar(a: number | undefined): number { if (a !== undefined) { return a; } return bar(); } function mainQux(a: number | undefined): number { if (a !== undefined) { return a; } return qux(); }
内容的提问来源于stack exchange,提问作者jooyeon yi
相关产品推荐
相关产品推荐

