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
Fromjuż spowodowało dopasowanie i nie da się go potem odróżnić.`${infer H}${From}${infer T}`Wnioskowanie jest zachłanne od lewej, więc
Hbierze 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ś.

