Solución comentada
Publicado el 17 de agosto de 2026La solución
type StartsWith<S extends string, P extends string> = S extends `${P}${string}` ? true : false
El error más común
type StartsWith<S extends string, P extends string> = S extends `${string}${P}${string}` ? true : false
Esto pregunta si P aparece *en cualquier sitio* — es includes, no startsWith. El ${string} inicial deja que el emparejamiento se desplace más allá del principio, así que "hello world" responde true para el prefijo "world".
Línea por línea
`${P}${string}`Un patrón de literal de plantilla está anclado por ambos extremos. Poner
Pprimero exige que los primeros caracteres deSseanP; el${string}final acepta luego cualquier resto, incluso ninguno.StartsWith<'abc', ''>El prefijo vacío reduce el patrón a
${string}, que satisface toda cadena — así que la respuesta estrue, igual que"abc".startsWith("")en tiempo de ejecución.
Para recordar
Donde pones ${string} en un patrón es donde permites holgura. Holgura al principio significa «contiene», al final «empieza por», y a ambos lados significa que has escrito un test de subcadena sin querer.

