Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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ć.

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    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.

    Wykorzystuje