Construcciones
Mapped types
Un bucle sobre una unión de claves que construye un tipo de objeto.
Qué es
Lee `{ [K in Keys]: Value }` como: para cada `K` de este conjunto de claves, produce una propiedad llamada `K` cuyo tipo es esa expresión. Dos decisiones independientes por clave — cómo se llama, mediante la cláusula opcional `as`, y qué contiene. `Partial`, `Required`, `Readonly`, `Pick` y `Record` son una línea de esto cada uno.
Ejemplos
Stringify<User>
→{ id: string; name: string; }Prefixed<User>
→{ getId: number; getName: string; }La cláusula `as` renombra la clave. Así un tipo mapeado produce nombres que no estaban en la entrada.
Filtered<User>
→{ name: string; }Renombrar una clave a `never` la elimina. Es la única forma en que un tipo mapeado puede descartar una propiedad.
Cada tipo resuelto de arriba lo imprimió TypeScript 5.9.3, no se escribió a mano.
Lo que no hace
- No puede eliminar una clave desde el lado del valor. Producir `never` como *tipo* de propiedad deja la clave presente e imposible de rellenar, que no es lo mismo que ausente.
- Deja de conservar los modificadores en cuanto el conjunto de claves se calcula. `[K in keyof T]` es homomórfico y mantiene `readonly` y `?`; añade una cláusula `as` o une las claves y se pierden salvo que los vuelvas a poner.
Conclusión
Las claves se deciden en la cláusula de clave y los valores en la de valor. La mayoría de los errores en tipos mapeados son una de esas respuestas usada por accidente en lugar de la otra.