Przejdź do treści
webtype.org#222 reverse-tuple · par 4

Nr 222 · 30 lipca 2026 · Trudna

Odwróć

Zaimplementuj `Reverse<T>`, aby zwracał krotkę z elementami w odwrotnej kolejności.

01

Spróbuj rozwiązać samodzielnie

Par 4

Zagadka

reverse-tuple.ts
Podejście 1 z 4Jeszcze nie sprawdzone

Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

Testy

4
  • Reverse<[1, 2, 3]>
    [3, 2, 1]
  • Reverse<[]>
    []
  • Reverse<['a']>
    ['a']
  • Reverse<[1, 'b', true]>
    [true, 'b', 1]

Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

Jak poszło innym

Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 31 lipca 2026

Rozwią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

  1. [infer H, ...infer R]

    Klasyczny podział na głowę i ogon. `H` wiąże pierwszy element, `R` wiąże krotkę całej reszty.

  2. [...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.