为什么 TypeScript 无法推断递归函数的类型

Ole*_*hai 3 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);
Run Code Online (Sandbox Code Playgroud)

为什么 TypeScript 推断出productto be的返回类型anyFlow 报告了此代码的错误,我相信该错误是正确的。

Nit*_*mer 5

从 2015 年 6 月 2 日起,就出现了一个关于此问题的问题(递归函数被推断为具有返回类型any),并且该问题已被关闭为“按设计”:

我们简要地制定了一个规范,概述了这一切在理论上是如何工作的,但它并没有付诸实施。
当前的规则是任何在解析其返回类型期间看到自身的函数都是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'
Run Code Online (Sandbox Code Playgroud)

操场上的代码