TypeScript中不同抛错函数的返回类型差异:函数c为何为void?
TypeScript中抛出错误的函数返回类型分析
嘿,这个问题问得特别到位,刚好涉及到TypeScript类型推断里一个容易被忽略的细节!咱们一步步拆解清楚:
首先先明确三个示例的实际类型:
let a = () => { throw new Error("A"); } // 类型:() => never let b = function() { throw new Error("B"); } // 类型:() => never function c() { throw new Error("C"); } // 类型:() => void
一、不同函数形式的返回类型情况
- 箭头函数(如
a)和函数表达式(如b):TypeScript的控制流分析会精准识别到这类函数永远无法正常完成执行——它们一被调用就抛出错误,没有任何返回值的可能。因此TypeScript会将它们的返回类型推断为never,这个类型专门用来表示“永远不会到达的代码路径”。 - 函数声明(如
c):在没有显式指定返回类型的情况下,即使函数体里只有throw语句,TypeScript也会默认推断其返回类型为void。
二、为什么函数c的返回类型是void?
答案很明确:这是TypeScript控制流分析的特殊规则导致的,和JavaScript本身的特性没有关系。
在JavaScript中,不管是箭头函数、函数表达式还是函数声明,只要函数体里只有throw语句,调用后都会直接抛出错误,不会产生任何返回值。但TypeScript在这里对函数声明做了特殊处理:
TypeScript早期版本为了兼容某些场景,制定了这样的推断规则:对于没有显式标注返回类型的函数声明,如果函数体内没有任何return语句(哪怕全程都是throw),默认返回类型会被推断为void。而箭头函数和函数表达式则会更严格地执行控制流分析,直接推断为never。
如果想让函数声明c也被推断为never,只需要显式添加返回类型标注即可:
function c(): never { throw new Error("C"); } // 现在类型为 () => never
内容的提问来源于stack exchange,提问作者109149
相关产品推荐
相关产品推荐

