2016-10-27 85 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