为什么TypeScript不能推断递归函数的类型



我有以下示例代码:

//Derived type of sum ([head, ...tail]: number[]) => any
let sum =
    ([head, ...tail]: number[]) => head ? head + sum(tail) : 0
let x: string = sum([1, 2, 3]);
alert(x);

为什么TypeScript将product的返回类型推断为any ?Flow报告这个代码的错误,我相信它是正确的。

从2015年6月2日起,有一个问题(递归函数被推断为返回类型any),它被关闭为"by design",说:

我们有一个简短的规范,概述了这一切在理论上是如何工作的,但它并没有实现。
当前的规则是,任何在其返回类型的解析是any。这看起来足够好了实践,因为总是可以添加所需的类型注释由于尾部调用,大多数函数不是这样递归的优化还不是ES规范的一部分

也就是声明返回类型:

let sum =
  ([head, ...tail]: number[]): number => head ? head + sum(tail) : 0
let x: string = sum([1, 2, 3]); // Error: Type 'number' is not assignable to type 'string'

(code in playground)

最新更新