Solución comentada
Publicado el 19 de septiembre de 2026La solución
type ZipObject< Keys extends readonly PropertyKey[], Values extends readonly unknown[] > = Prettify< Keys extends readonly [infer K extends PropertyKey, ...infer KR extends PropertyKey[]] ? Values extends readonly [infer V, ...infer VR] ? { [P in K]: V } & ZipObject<KR, VR> : {} : {} >
El error más común
type ZipObject<Keys extends readonly PropertyKey[], Values extends readonly unknown[]> = Keys extends readonly [infer K extends PropertyKey, ...infer KR extends PropertyKey[]] ? Values extends readonly [infer V, ...infer VR] ? { [P in K]: V } & ZipObject<KR, VR> : {} : {}
Las propiedades son correctas, pero el resultado sigue siendo una intersección de objetos de una propiedad. La asignabilidad lo acepta; este comprobador exige identidad exacta, así que el mapeo final forma parte de la respuesta.
Línea por línea
{ [P in K]: V } & ZipObject<KR, VR>Cada paso consume una posición de ambas tuplas e intersecta esa propiedad con el resto construido de forma recursiva.
Prettify<Mapear las claves acumuladas materializa un único tipo de objeto normal, que es la forma nombrada por las pruebas.
Para recordar
Los constructores recursivos de objetos suelen acumular intersecciones. Un mapeo de identidad final no es cosmético cuando importa la igualdad exacta.

