Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2456

    Cykliczny alias typu

    Type alias 'Loop' circularly references itself.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Alias jest zdefiniowany przez samego siebie i nic pomiędzy, więc nie ma momentu, w którym cokolwiek znaczy.

    Odtworzenie

    type Loop = Loop

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    Typ rekurencyjny jest w porządku — archiwum jest ich pełne — ale rekurencja musi przechodzić przez coś, co ją odracza: właściwość obiektu, element tablicy, gałąź warunkową, która potrafi się zatrzymać. Goła autoreferencja nie ma takiego kroku, więc nie ma czego rozwijać ani czym kończyć. Kompilator nie odmawia rekurencji; zwraca uwagę, że to nie jest rekurencja, tylko definicja zjadająca samą siebie.

    Naprawy

    1. 01
      type Loop = { next: Loop }
      
      declare const chain: Loop
      const deep = chain.next.next

      Umieść odwołanie za właściwością. Typy obiektowe są leniwe, więc `Loop` wewnątrz `{ next: … }` rozwija się dopiero, gdy ktoś po nie sięgnie.

    2. 02
      type Nested<T> = T extends [infer Head, ...infer Rest] ? Head | Nested<Rest> : never
      
      type Flat = Nested<[1, 2, 3]>

      Albo wykonuj rekurencję przez warunek, który potrafi dojść do przypadku bazowego. Każdy krok usuwa tu element, więc rozwijanie na pewno się zatrzyma.

    Wniosek

    Rekurencja potrzebuje miejsca na pauzę i miejsca na koniec. Alias nazywający wyłącznie siebie nie ma żadnego z nich.

    Dokąd dalej

    Błędy