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

Там будет вопрос (Recursive functions are inferred to have return type any) об этом от 2 июня 2015 года, и он был закрыт, как «дизайн», говоря:

Мы кратко имели спецификации, что описал, каким образом все это может работать в теории, но это не привело к реализации.
Текущее правило заключается в том, что любая функция, которая видит себя во время разрешения возвращаемого типа , является любой. Это, как представляется, достаточно хорошо в практики, так как всегда можно добавить нужный тип аннотации и большинство функций не является рекурсивной, как это из-за хвост вызов оптимизаций не является часть спецификации 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)

Смежные вопросы