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

时间:2016-10-27 18:47:17

标签: 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报告此code的错误,我认为这是错误的。

1 个答案:

答案 0 :(得分:4)

从2015年6月2日开始存在一个问题(Recursive functions are inferred to have return type 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