TS7023
Nie można wywnioskować typu zwrotnego rekurencji
'factorial' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions.Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.
Funkcja rekurencyjna wymaga od inferencji znajomości typu zwrotnego, zanim ten sam typ został ustalony.
Odtworzenie
function factorial(n: number) {
return n <= 1 ? 1 : n * factorial(n - 1)
}Build potwierdza, że to emituje dokładnie ten kod.
Dlaczego kompilator tak mówi
Inferencja podąża za wyrażeniem zwrotnym, które wywołuje funkcję, której wynik właśnie jest wywnioskowywany. Cykl nie ma niezależnej adnotacji jako kotwicy, więc tryb ścisły odmawia przyjęcia `any`.
Naprawy
- 01
function factorial(n: number): number { return n <= 1 ? 1 : n * factorial(n - 1) }
Jawnie opisz granicę rekurencji; ciało zostanie następnie sprawdzone względem niej.
- 02
function factorial(n: number) { let result = 1 for (let value = 2; value <= n; value += 1) { result *= value } return result }Forma iteracyjna usuwa cykl inferencji, gdy rekurencja nie jest istotna.
Wniosek
Funkcje rekurencyjne są dobrym miejscem na jawne typy zwrotne: adnotacja przerywa cykl i dokumentuje niezmiennik.
