Solución comentada
Publicado el 28 de agosto de 2026La solución
type Repeat< S extends string, N extends number, Acc extends unknown[] = [], > = Acc['length'] extends N ? '' : `${S}${Repeat<S, N, [...Acc, unknown]>}`
El error más común
type Repeat< S extends string, N extends number, Acc extends unknown[] = [], > = Acc['length'] extends N ? S : `${S}${Repeat<S, N, [...Acc, unknown]>}`
El caso base emite una copia de más. Devolver S cuando el contador está lleno hace que el paso terminal también aporte, así que Repeat<"ab", 3> produce cuatro copias — y Repeat<"x", 0> devuelve "x" cuando no debería devolver nada.
Línea por línea
Acc['length'] extends N ? ''El caso base debe ser el *elemento neutro* de la operación que construyes. Para la concatenación es la cadena vacía, igual que
[]lo es al construir una tupla y0al sumar números.[...Acc, unknown]El acumulador contiene
unknownporque su contenido es irrelevante — solo se lee su longitud. Es una cuenta de marcas, no una colección.
Para recordar
Cuando un bucle a nivel de tipos se desvía en uno, mira lo que devuelve el caso base, no el paso recursivo. La rama terminal debe aportar el elemento neutro, no otra copia del contenido.

