Solución comentada
Publicado el 6 de agosto de 2026La solución
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
El error más común
type Replace<S extends string, From extends string, To extends string> = S extends `${infer H}${From}${infer T}` ? `${H}${To}${T}` : S
Correcto para toda entrada salvo un `From` vacío. La cadena vacía cabe entre dos caracteres cualesquiera, así que el patrón encaja con `H` vacío e inserta `To` al principio — `Replace<"abc", "", "x">` da `"xabc"`.
Línea por línea
From extends '' ? SLa guarda debe ir primero. Una vez alcanzado el patrón de plantilla, un `From` vacío ya ha hecho que el emparejamiento tenga éxito, y después no hay forma de distinguirlo.
`${infer H}${From}${infer T}`La inferencia es ávida desde la izquierda, así que `H` toma el prefijo más corto que aún permita encajar el resto. Por eso se reemplaza únicamente la *primera* aparición.
Para recordar
La cadena vacía es el null de los tipos de literal de plantilla: encaja en todas partes y rompe en silencio los patrones que asumen que encajar significa haber encontrado algo.