Przejdź do treści
webtype.org#224 join-tuple · par 4

Nr 224 · 1 sierpnia 2026 · Trudna

Złącz

Zaimplementuj `Join<T, D>`, aby łączył krotkę łańcuchów separatorem `D` pomiędzy nimi. Bez separatora przed pierwszym i po ostatnim elemencie.

01

Spróbuj rozwiązać samodzielnie

Par 4

Zagadka

join-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
  • Join<['a', 'b', 'c'], '-'>
    'a-b-c'
  • Join<['solo'], '-'>
    'solo'
  • Join<[], '-'>
    ''
  • Join<['x', 'y'], ''>
    'xy'

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

Rozwiązanie

type Join<T extends readonly string[], D extends string> =
  T extends readonly [infer F extends string, ...infer R extends string[]]
    ? R extends readonly []
      ? F
      : `${F}${D}${Join<R, D>}`
    : ''

Najczęstsza błędna odpowiedź

type Join<T extends readonly string[], D extends string> =
  T extends readonly [infer F extends string, ...infer R extends string[]]
    ? `${F}${D}${Join<R, D>}`
    : ''

Każdy poziom dokłada separator, łącznie z ostatnim, więc `["a","b","c"]` daje `"a-b-c-"`. Łączenie to nie „wstaw separator po każdym elemencie”, tylko „wstaw separator *pomiędzy* elementy” — a różnica ujawnia się dopiero na końcu.

Linia po linii

  1. infer F extends string

    Ograniczenie `extends string` przy `infer` zawęża to, co zostaje związane. Bez niego `F` byłoby `unknown`, którego nie da się wstawić do typu literału szablonowego.

  2. R extends readonly [] ? F

    Strażnik, który czyni z tego złączenie, a nie dopisek. Gdy nic nie następuje, element trafia na wyjście sam i rekurencja kończy się bez dokładania separatora.

Do zapamiętania

Rekurencyjne budowanie łańcuchów prawie zawsze potrzebuje osobnego przypadku bazowego dla ostatniego elementu. Jeśli na końcu wyniku zostaje samotny separator, tego przypadku brakuje.