Rozwiązanie z komentarzem
Opublikowano 3 września 2026Rozwiązanie
type Fill<N extends number, V, R extends V[] = []> = R['length'] extends N ? R : Fill<N, V, [...R, V]>Najczęstsza błędna odpowiedź
type Fill<N extends number, V, R extends V[] = []> = R['length'] extends N ? R : [...R, V]To dokłada jeden element i kończy. Gałąź else musi wywołać Fill ponownie — dopisanie jest krokiem, nie odpowiedzią. Napisane tak, Fill<3, "x"> zwraca ["x"], bo typ wykonał się dokładnie raz.
Linia po linii
R['length'] extends N ? R : ...Akumulator jest zarazem licznikiem. Krotka zna swoją długość, więc nie ma tu żadnej arytmetyki — wystarczy zapytać, czy osiągnęła już
N.Fill<N, V, [...R, V]>Każda rekurencja przekazuje kolejnemu wywołaniu odrobinę dłuższą krotkę.
Fill<0, number>w ogóle nie wchodzi w tę gałąź, bo pusty akumulator ma już żądaną długość.
Do zapamiętania
Parametr-akumulator zamienia typ rekurencyjny w pętlę ze zmienną. Przypadek bazowy to pytanie o akumulator, a krok to ten sam typ wywołany z większym.

