Przejdź do treści
webtype.org#225 trim-string · par 3

Nr 225 · 2 sierpnia 2026 · Średnia

Przytnij

Zaimplementuj `Trim<S>`, aby usuwał białe znaki z obu końców typu łańcuchowego. `Whitespace` jest dostępne i obejmuje spacje, tabulatory i znaki nowej linii.

01

Spróbuj rozwiązać samodzielnie

Par 3

Zagadka

trim-string.ts
type Whitespace = ' ' | '\n' | '\t'
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
  • Trim<' hello '>
    'hello'
  • Trim<'nospace'>
    'nospace'
  • Trim<'\ttabbed\t'>
    'tabbed'
  • Trim<' '>
    ''

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

Rozwiązanie

type Trim<S extends string> = S extends `${Whitespace}${infer R}`
  ? Trim<R>
  : S extends `${infer R}${Whitespace}`
    ? Trim<R>
    : S

Najczęstsza błędna odpowiedź

type Trim<S extends string> = S extends `${Whitespace}${infer R}${Whitespace}`
  ? Trim<R>
  : S

Wymaganie białych znaków po obu stronach w jednym wzorcu zawodzi, gdy tylko jeden koniec je ma: `" left"` nie pasuje, więc nic nie zostaje przycięte. Oba końce trzeba obsłużyć niezależnie.

Linia po linii

  1. `${Whitespace}${infer R}`

    `Whitespace` to unia, więc ten wzorzec jest w istocie trzema wzorcami naraz — literał szablonowy pasuje, jeśli którykolwiek element unii mieści się w miejscu.

  2. Trim<R>

    Na jedno przejście odpada jeden znak, a wynik wraca na wejście. Obie gałęzie wywołują ten sam typ, więc białe znaki z przodu i z tyłu zjada ta sama pętla.

Do zapamiętania

Unia wewnątrz wzorca literału szablonowego zwielokrotnia sprawdzane wzorce. Uporządkowane gałęzie warunku pozwalają potem zdejmować po jednym końcu bez pisania dwóch osobnych typów.