Solución comentada
Publicado el 9 de septiembre de 2026La solución
type Invert<T extends Record<string, string>> = { [K in keyof T as T[K]]: K }El error más común
type Invert<T extends Record<string, string>> = { [K in keyof T as T[K]]: T[K] }La mitad del intercambio. La clave se renombra al valor antiguo, lo cual es correcto, y luego el valor se fija también al valor antiguo — produciendo { x: "x" } donde la comprobación quiere { x: "a" }. Renombrar una clave no mueve la clave antigua a ninguna parte; si la quieres, tienes que ponerla tú en la cláusula de valor.
Línea por línea
as T[K]La nueva clave es el valor antiguo.
asacepta cualquier expresión que produzca un tipo de clave, y un acceso indexado lo es.: KY el nuevo valor es la clave antigua, todavía en el ámbito, todavía un literal. Las dos cláusulas son independientes — y eso es lo que permite un intercambio limpio en una línea.
Para recordar
Un tipo mapeado toma dos decisiones separadas por clave: cómo se llama y qué contiene. La mayoría de los errores en tipos mapeados son una de esas dos respuestas reutilizada por accidente en el lugar de la otra.

