Rozwiązanie z komentarzem
Opublikowano 31 lipca 2026Rozwiązanie
type Reverse<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? [...Reverse<R>, H] : []
Najczęstsza błędna odpowiedź
type Reverse<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? [H, ...Reverse<R>] : []
To poprawnie rekurencyjnie odbudowuje krotkę w tej samej kolejności, w jakiej ją rozłożyło — czyli jest wymyślną funkcją tożsamościową. Odwrócenie zależy wyłącznie od tego, po której stronie rozwinięcia trafi głowa.
Linia po linii
[infer H, ...infer R]Klasyczny podział na głowę i ogon. `H` wiąże pierwszy element, `R` wiąże krotkę całej reszty.
[...Reverse<R>, H]Głowa dołączana jest *po* odwróconym ogonie. Pierwszy element wejścia trafia więc na koniec, a każdy poziom rekurencji przesuwa swoją głowę o jedno miejsce dalej.
Do zapamiętania
Rekurencja głowa-ogon odbudowuje krotkę element po elemencie; kolejność składania to jedyne, co odróżnia kopię od odwrócenia, filtra czy mapowania.