Przejdź do treści
TS7023

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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

    1. 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.

    2. 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.

    Dokąd dalej

    Błędy