2016-10-27 47 views
1

的类型,我有以下示例代码:为什么打字稿不能推断递归函数

//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); 

为什么打字稿推断返回product类型为any?流程报告此code错误,我相信这是错误的。

回答

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