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 = LoopBuild 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
- 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.
- 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.