Rozwiązanie z komentarzem
Opublikowano 23 sierpnia 2026Rozwiązanie
type Chunk< T extends readonly unknown[], N extends number, Acc extends unknown[] = [], > = Acc['length'] extends N ? [Acc, ...Chunk<T, N>] : T extends readonly [infer H, ...infer R] ? Chunk<R, N, [...Acc, H]> : Acc extends [] ? [] : [Acc]
Najczęstsza błędna odpowiedź
type Chunk< T extends readonly unknown[], N extends number, Acc extends unknown[] = [], > = Acc['length'] extends N ? [Acc, ...Chunk<T, N>] : T extends readonly [infer H, ...infer R] ? Chunk<R, N, [...Acc, H]> : [Acc]
Prawie dobrze i błędnie tylko tam, gdzie najtrudniej to zauważyć. Bez strażnika `Acc extends []` puste wejście daje `[[]]` — krotkę z jedną pustą grupą — zamiast `[]`. Wejście dzielące się bez reszty trafia w tę samą ścieżkę i zyskuje pustą grupę na końcu.
Linia po linii
Acc['length'] extends NTest pełnej grupy jest pierwszy, przed obejrzeniem wejścia. Osiągnięcie `N` wypuszcza grupę i zaczyna od nowa z domyślnym pustym akumulatorem, bo `Chunk<T, N>` pomija trzeci argument.
Acc extends [] ? [] : [Acc]Wejście się skończyło. Albo ostatnia grupa jest pusta — poprzednia zamknęła się dokładnie na granicy i nie ma czego wypuszczać — albo trzyma krótką grupę końcową, która należy do wyniku.
Do zapamiętania
Rekurencje z dwoma wyjściami wymagają sprawdzenia obu. Przypadek graniczny, w którym wejście dzieli się bez reszty, wymyka się najłatwiej — i akurat jego ręcznie pisany przykład zwykle unika.
