Solución comentada
Publicado el 3 de septiembre de 2026La solución
type Fill<N extends number, V, R extends V[] = []> = R['length'] extends N ? R : Fill<N, V, [...R, V]>El error más común
type Fill<N extends number, V, R extends V[] = []> = R['length'] extends N ? R : [...R, V]Esto añade un elemento y se detiene. La rama else tiene que volver a llamar a Fill — añadir es el paso, no la respuesta. Escrito así, Fill<3, "x"> devuelve ["x"], porque el tipo se ejecutó exactamente una vez.
Línea por línea
R['length'] extends N ? R : ...El acumulador es también el contador. Una tupla conoce su propia longitud, así que no hay aritmética que hacer — basta con preguntar si ya llegó a
N.Fill<N, V, [...R, V]>Cada recursión entrega a la llamada siguiente una tupla algo más larga.
Fill<0, number>no entra nunca en esta rama, porque un acumulador vacío ya tiene la longitud pedida.
Para recordar
Un parámetro acumulador convierte un tipo recursivo en un bucle con una variable. El caso base es una pregunta sobre el acumulador, y el paso es el mismo tipo llamado con uno mayor.

