Przejdź do treści
webtype.orgwebtype.org#217 split-string · par 4

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 217 · 25 lipca 2026 · Trudna

    Podziel

    Zaimplementuj `Split<S, D>`, aby dzielił łańcuch `S` przy każdym wystąpieniu separatora `D`, zwracając krotkę fragmentów.

    01

    Spróbuj rozwiązać samodzielnie

    Par 4

    Zagadka

    split-string.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
    • Split<'a,b,c', ','>
      ['a', 'b', 'c']
    • Split<'nope', ','>
      ['nope']
    • Split<'a/b', '/'>
      ['a', 'b']
    • Split<'', ','>
      ['']

    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 26 lipca 2026

    Rozwiązanie

    type Split<S extends string, D extends string> =
      S extends `${infer Head}${D}${infer Tail}` ? [Head, ...Split<Tail, D>] : [S]

    Najczęstsza błędna odpowiedź

    type Split<S extends string, D extends string> =
      S extends `${infer Head}${D}${infer Tail}` ? [Head, Split<Tail, D>] : [S]

    Bez rozwinięcia każdy wynik rekurencji zagnieżdża się o poziom głębiej: `["a", ["b", ["c"]]]`. To `...` spłaszcza rekurencję w jedną krotkę.

    Linia po linii

    1. `${infer Head}${D}${infer Tail}`

      Wnioskowanie z literału szablonowego jest zachłanne od lewej, więc `Head` wiąże najkrótszy przedrostek pozwalający dopasować resztę wzorca — dając pierwsze pole, nie ostatnie.

    2. [Head, ...Split<Tail, D>]

      Rozwinięcie wstawia krotkę z rekurencji w miejscu, więc każdy poziom dokłada jeden element do płaskiego wyniku.

    3. : [S]

      Nie został już żaden separator. Cały pozostały łańcuch to ostatni fragment, opakowany w krotkę, żeby rozwinięcie powyżej miało co wstawić.

    Do zapamiętania

    Rekurencyjne typy łańcuchowe rozkładają się od głowy i składają z powrotem rozwinięciami. Zapomniane rozwinięcie to najczęstszy błąd przy budowaniu list na poziomie typów.

    Wykorzystuje