Przejdź do treści
webtype.org#228 replace-string · par 3

Nr 228 · 5 sierpnia 2026 · Średnia

Zamień

Zaimplementuj `Replace<S, From, To>`, aby zamieniał **pierwsze** wystąpienie `From` w `S` na `To`. Puste `From` nie zamienia niczego.

01

Spróbuj rozwiązać samodzielnie

Par 3

Zagadka

replace-string.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
  • Replace<'hello world', 'world', 'there'>
    'hello there'
  • Replace<'abc', 'x', 'y'>
    'abc'
  • Replace<'aaa', 'a', 'b'>
    'baa'
  • Replace<'abc', '', 'x'>
    'abc'

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

Rozwiązanie

type Replace<S extends string, From extends string, To extends string> =
  From extends ''
    ? S
    : S extends `${infer H}${From}${infer T}`
      ? `${H}${To}${T}`
      : S

Najczęstsza błędna odpowiedź

type Replace<S extends string, From extends string, To extends string> =
  S extends `${infer H}${From}${infer T}` ? `${H}${To}${T}` : S

Poprawne dla każdego wejścia poza pustym `From`. Pusty łańcuch mieści się między dowolnymi dwoma znakami, więc wzorzec pasuje z pustym `H` i wstawia `To` na początku — `Replace<"abc", "", "x">` daje `"xabc"`.

Linia po linii

  1. From extends '' ? S

    Strażnik musi być pierwszy. Gdy dojdzie do wzorca szablonowego, puste `From` już spowodowało dopasowanie i nie da się go potem odróżnić.

  2. `${infer H}${From}${infer T}`

    Wnioskowanie jest zachłanne od lewej, więc `H` bierze najkrótszy przedrostek pozwalający dopasować resztę. Właśnie dlatego zamieniane jest tylko *pierwsze* wystąpienie.

Do zapamiętania

Pusty łańcuch to `null` typów literałów szablonowych: pasuje wszędzie i po cichu psuje wzorce zakładające, że dopasowanie oznacza znalezienie czegoś.