Lecciones del módulo (2/2)
Tipos Mapeados
Los tipos mapeados permiten crear nuevos tipos a partir de tipos existentes, transformando las propiedades una a una. Se basan en la sintaxis de bucles sobre claves, utilizando el operador keyof.
type Mapped<T> = {
[P in keyof T]: T[P];
};Este ejemplo es un tipo mapeado idéntico al original: recorre cada clave P en keyof T y le asigna el mismo tipo T[P].
Modificadores de mutabilidad y opcionalidad
Podemos añadir o eliminar modificadores como readonly y ? (opcionalidad) anteponiendo + (añadir, por defecto) o - (eliminar).
Por ejemplo, para eliminar la opcionalidad de todas las propiedades de un tipo (haciéndolas obligatorias):
type Concrete<T> = {
[P in keyof T]-?: T[P];
};El modificador -? elimina la bandera de opcionalidad de cada propiedad.
Remapeo de claves con as
En TypeScript 4.1+, es posible remapear las claves de un tipo mapeado usando la cláusula as y tipos de plantilla literal (template literal types).
type ScriviSetters<T> = {
[K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};Aquí estamos cambiando el nombre de cada propiedad K a set[ClaveCapitalizada] y cambiando su tipo a una función setter.
Pruébalo tú mismo
Ejercicio 1: Hacer las propiedades anulables
Declara un tipo mapeado genérico Nullable<T> que tome un objeto T y transforme cada una de sus propiedades para que también pueda aceptar el valor null (por ejemplo, T[K] | null).
Mostrar pista
Usa la sintaxis [K in keyof T]: T[K] | null; dentro del objeto del tipo mapeado.
Solución disponible después de 3 intentos
Ejercicio 2: Generar Getters dinámicos con as
Crea un tipo mapeado llamado GetterNames<T> que transforme las claves del objeto T añadiendo el prefijo 'get' capitalizando la clave original (usa Capitalize). Por ejemplo, si una clave es name, se convertirá en getName. Establece el tipo de las propiedades como () => T[K].
Mostrar pista
Usa as \`get\${Capitalize<string & K>}\` para remapear la clave y () => T[K] como tipo de retorno de la propiedad.
Solución disponible después de 3 intentos