Rozwiązanie z komentarzem
Opublikowano 6 sierpnia 2026Rozwią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
From extends '' ? SStrażnik musi być pierwszy. Gdy dojdzie do wzorca szablonowego, puste `From` już spowodowało dopasowanie i nie da się go potem odróżnić.
`${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ś.