Solución comentada
Publicado el 14 de septiembre de 2026La solución
type TitleCase<S extends string> = S extends `${infer W} ${infer Rest}` ? `${Capitalize<W>} ${TitleCase<Rest>}` : Capitalize<S>
El error más común
type TitleCase<S extends string> = Capitalize<S>Capitalize capitaliza una cadena, en singular — el primer carácter del conjunto y nada más. "hello world" se convierte en "Hello world". El tipo integrado no tiene noción de palabra, así que todo lo que tenga forma de palabra has de encontrarlo tú antes.
Línea por línea
`${infer W} ${infer Rest}`El espacio literal entre los marcadores es lo que convierte esto en un separador de palabras. La inferencia se detiene en el primero que encuentra, así que
Wes siempre una sola palabra.: Capitalize<S>El caso base es la última palabra, y es el único lugar donde
Capitalizese aplica a toda la cadena restante — para entonces, toda la cadena restante *es* una palabra.
Para recordar
Los tipos intrínsecos de cadena trabajan sobre cadenas enteras. Las palabras, los segmentos y las rutas son cosas que primero recortas con patrones de plantilla y solo después entregas.

