Solución comentada
Publicado el 13 de septiembre de 2026La solución
type StrLength<S extends string, R extends unknown[] = []> = S extends `${string}${infer Rest}` ? StrLength<Rest, [...R, unknown]> : R['length']
El error más común
type StrLength<S extends string, R extends unknown[] = []> = S['length']Un tipo de cadena sí tiene length, y es number — el general, no 5. Solo las tuplas llevan su longitud como tipo literal. Por eso casi todo tipo que cuenta en TypeScript se escribe con un acumulador de tupla cuyo contenido nadie llega a leer nunca.
Línea por línea
`${string}${infer Rest}`El primer marcador es
stringy noinferporque el carácter en sí no importa — solo que hubiera uno.[...R, unknown]El acumulador es una cuenta de muescas. El tipo de sus elementos es irrelevante; se elige
unknownprecisamente porque nadie mirará nunca dentro.R['length']Y aquí se cobra la cuenta. Como
Res una tupla, sulengthes el literal5, que es lo que pide la comprobación.
Para recordar
Los números a nivel de tipos son longitudes de tupla. Siempre que necesites contar algo, la respuesta es una tupla que haces crecer y a la que luego preguntas su longitud.

