Solución comentada
Publicado el 10 de agosto de 2026La solución
type Zip<A extends readonly unknown[], B extends readonly unknown[]> = A extends readonly [infer AH, ...infer AR] ? B extends readonly [infer BH, ...infer BR] ? [[AH, BH], ...Zip<AR, BR>] : [] : []
El error más común
type Zip<A extends readonly unknown[], B extends readonly unknown[]> = A extends readonly [infer AH, ...infer AR] ? B extends readonly [infer BH, ...infer BR] ? [AH, BH, ...Zip<AR, BR>] : [] : []
Sin los corchetes internos los pares se esparcen planos en el resultado: `[1, "a", 2, "b"]` en vez de `[[1, "a"], [2, "b"]]`. Hacer zip va de estructura, y la estructura vive en esos corchetes.
Línea por línea
[[AH, BH], ...Zip<AR, BR>]El `[AH, BH]` interno es un par; la expansión añade los pares del resto. Anidar una tupla dentro de otra es cómo mantienes el emparejamiento visible en el tipo.
: []Ambas ramas de salida terminan la recursión, así que la tupla que se agote primero detiene el zip. Eso da el comportamiento «la más corta» sin medir ninguna longitud.
Para recordar
Recorrer dos estructuras a la vez son solo dos condicionales de desestructuración anidados. La decisión de diseño interesante es qué pasa cuando difieren en longitud — y aquí la respuesta es no hacer nada especial.