Solución comentada
Publicado el 23 de agosto de 2026La solución
type Chunk< T extends readonly unknown[], N extends number, Acc extends unknown[] = [], > = Acc['length'] extends N ? [Acc, ...Chunk<T, N>] : T extends readonly [infer H, ...infer R] ? Chunk<R, N, [...Acc, H]> : Acc extends [] ? [] : [Acc]
El error más común
type Chunk< T extends readonly unknown[], N extends number, Acc extends unknown[] = [], > = Acc['length'] extends N ? [Acc, ...Chunk<T, N>] : T extends readonly [infer H, ...infer R] ? Chunk<R, N, [...Acc, H]> : [Acc]
Casi correcto, y erróneo justo donde más cuesta verlo. Sin la guarda `Acc extends []`, la entrada vacía produce `[[]]` — una tupla con un grupo vacío — en vez de `[]`. Una entrada divisible exacta cae en la misma rama y gana un grupo vacío al final.
Línea por línea
Acc['length'] extends NLa prueba de grupo lleno va primero, antes de examinar la entrada. Alcanzar `N` emite el grupo y reinicia con el acumulador vacío por defecto, porque `Chunk<T, N>` omite el tercer argumento.
Acc extends [] ? [] : [Acc]La entrada se agotó. O el último grupo está vacío — el anterior cerró justo en el límite y no queda nada que emitir — o contiene un grupo final corto que sí pertenece al resultado.
Para recordar
Las recursiones con dos salidas necesitan probar ambas. El caso límite en que la entrada se divide exacta es el que se escapa, y es justo el que un ejemplo escrito a mano suele evitar.
