Przejdź do treści
webtype.org#234 tuple-to-union · par 2

Nr 234 · 17 sierpnia 2026 · Łatwa

KrotkaNaUnię

Zaimplementuj `TupleToUnion<T>`, aby zamieniał krotkę w unię typów jej elementów. Całość to jeden dostęp indeksowany.

01

Spróbuj rozwiązać samodzielnie

Par 2

Zagadka

tuple-to-union.ts
Podejście 1 z 2Jeszcze nie sprawdzone

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

Testy

3
  • TupleToUnion<[1, 2, 3]>
    1 | 2 | 3
  • TupleToUnion<['a']>
    'a'
  • TupleToUnion<[]>
    never

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 18 sierpnia 2026

Rozwiązanie

type TupleToUnion<T extends readonly unknown[]> = T[number]

Najczęstsza błędna odpowiedź

type TupleToUnion<T extends readonly unknown[]> =
  T extends readonly [infer H, ...infer R] ? H : never

Rozsądny odruch — rozłóż i weź głowę — ale na tym się kończy i zwraca tylko pierwszy element. Rekurencja i złączenie wyników zadziałałyby, tyle że to droga okrężna: `T[number]` robi to od razu.

Linia po linii

  1. T[number]

    Dostęp indeksowany, którego kluczem jest cały typ `number`. Skoro każdy poprawny indeks liczbowy wybiera jeden element, zapytanie o wszystkie naraz daje unię typów wszystkich elementów.

  2. TupleToUnion<[]>

    Pusta krotka nie ma żadnego poprawnego indeksu liczbowego, więc wraca unia zera rzeczy — a unia niczego to `never`.

Do zapamiętania

Sięgaj po rekurencję dopiero wtedy, gdy indeksowanie nie wyraża pytania. `T[number]`, `keyof T` i `T[keyof T]` odpowiadają na zaskakująco dużą część problemów z krotkami i obiektami w jednej linii.