Przejdź do treści
webtype.org#232 zip-tuples · par 3

Nr 232 · 9 sierpnia 2026 · Średnia

Zip

Zaimplementuj `Zip<A, B>`, aby łączył elementy dwóch krotek pozycyjnie w pary. Gdy krotki mają różną długość, zatrzymaj się na krótszej.

01

Spróbuj rozwiązać samodzielnie

Par 3

Zagadka

zip-tuples.ts
Podejście 1 z 3Jeszcze nie sprawdzone

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

Testy

4
  • Zip<[1, 2], ['a', 'b']>
    [[1, 'a'], [2, 'b']]
  • Zip<[], []>
    []
  • Zip<[1, 2, 3], ['a']>
    [[1, 'a']]
  • Zip<[1], ['a', 'b', 'c']>
    [[1, 'a']]

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

Rozwiązanie

type Zip<A extends readonly unknown[], B extends readonly unknown[]> =
  A extends readonly [infer AH, ...infer AR]
    ? B extends readonly [infer BH, ...infer BR]
      ? [[AH, BH], ...Zip<AR, BR>]
      : []
    : []

Najczęstsza błędna odpowiedź

type Zip<A extends readonly unknown[], B extends readonly unknown[]> =
  A extends readonly [infer AH, ...infer AR]
    ? B extends readonly [infer BH, ...infer BR]
      ? [AH, BH, ...Zip<AR, BR>]
      : []
    : []

Bez wewnętrznych nawiasów pary rozsypują się płasko w wyniku: `[1, "a", 2, "b"]` zamiast `[[1, "a"], [2, "b"]]`. Zipowanie polega na strukturze, a struktura mieszka w tych nawiasach.

Linia po linii

  1. [[AH, BH], ...Zip<AR, BR>]

    Wewnętrzne `[AH, BH]` to jedna para; rozwinięcie dokłada pary z reszty. Zagnieżdżenie krotki w krotce utrzymuje parowanie widoczne w typie.

  2. : []

    Obie gałęzie awaryjne kończą rekurencję, więc ta krotka, która wyczerpie się pierwsza, zatrzymuje zip. Daje to zachowanie „krótsza z dwóch” bez mierzenia którejkolwiek długości.

Do zapamiętania

Przechodzenie dwóch struktur naraz to po prostu dwa zagnieżdżone warunki rozkładające. Ciekawą decyzją projektową jest to, co się dzieje, gdy różnią się długością — a tutaj odpowiedzią jest nierobienie niczego szczególnego.