Saltar al contenido principal
eLearner.app
Módulo 6 · Lección 2 de 212/14 en el curso~15 min
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.

TS
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):

TS
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).

TS
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

Ejercicio#ts.m6.l2.e1
Intentos: 0Cargando...

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).

Cargando editor...
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

Ejercicio#ts.m6.l2.e2
Intentos: 0Cargando...

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].

Cargando editor...
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