Introducción a los tipos mapeados de TypeScript
Los tipos mapeados en TypeScript proporcionan una forma de crear nuevos tipos mediante la transformación de los existentes. Son una herramienta poderosa para manejar operaciones de tipos complejas y garantizar la seguridad de los tipos en aplicaciones TypeScript. Este artículo presenta los tipos mapeados, explica su sintaxis y proporciona ejemplos para demostrar su uso.
¿Qué son los tipos mapeados?
Los tipos mapeados permiten la creación de nuevos tipos mediante la aplicación de una transformación a cada propiedad de un tipo existente. Suelen utilizarse para modificar o ampliar tipos de forma flexible. La sintaxis básica de un tipo mapeado es:
type MappedType = {
[K in keyof T]: NewType;
};
En esta sintaxis:
T
es el tipo original.K
representa cada tecla enT
.NewType
es el nuevo tipo asignado a cada propiedad.
Ejemplo básico de tipos mapeados
A continuación se muestra un ejemplo simple de un tipo mapeado que convierte todas las propiedades de un tipo dado en de solo lectura:
type ReadOnly = {
readonly [K in keyof T]: T[K];
};
type User = {
name: string;
age: number;
};
type ReadOnlyUser = ReadOnly;
En este ejemplo, el tipo mapeado ReadOnly
transforma todas las propiedades del tipo User
para que sean de solo lectura, lo que da como resultado un nuevo tipo ReadOnlyUser
donde todas las propiedades son inmutables.
Tipos mapeados con transformaciones de tipos
Los tipos mapeados también se pueden utilizar para transformar tipos de formas más complejas. Por ejemplo, un tipo mapeado que hace que todas las propiedades sean opcionales:
type Partial = {
[K in keyof T]?: T[K];
};
type User = {
name: string;
age: number;
};
type PartialUser = Partial;
En este ejemplo, el tipo mapeado Partial
hace que todas las propiedades del tipo User
sean opcionales, lo que da como resultado un nuevo tipo PartialUser
donde cada propiedad es opcional.
Uso de tipos mapeados con tipos condicionales
Los tipos mapeados se pueden combinar con tipos condicionales para realizar operaciones de tipo más sofisticadas. Por ejemplo, crear un tipo que solo incluya propiedades de un tipo determinado:
type OnlyStrings = {
[K in keyof T]: T[K] extends string ? T[K] : never;
};
type User = {
name: string;
age: number;
email: string;
};
type StringProperties = OnlyStrings;
En este ejemplo, el tipo mapeado OnlyStrings
filtra las propiedades que no son del tipo string
, lo que genera un nuevo tipo StringProperties
que incluye solo propiedades de cadena del tipo User
.
Tipos de mapas avanzados
Los casos de uso avanzados para los tipos asignados incluyen la creación de tipos que modifican los tipos existentes en función de diversas condiciones. Por ejemplo, un tipo asignado que agrega un sufijo a cada nombre de propiedad:
type WithSuffix<T, S extends string> = {
[K in keyof T as `${string & K}${S}`]: T[K];
};
type User = {
name: string;
age: number;
};
type UserWithSuffix = WithSuffix<User, "Prop">;
En este ejemplo, el tipo mapeado WithSuffix
agrega un sufijo a cada nombre de propiedad del tipo User
, lo que da como resultado un nuevo tipo UserWithSuffix
donde los nombres de propiedad tienen el sufijo especificado.
Conclusión
Los tipos mapeados en TypeScript son una característica versátil que permite a los desarrolladores crear nuevos tipos mediante la transformación de los existentes. Al comprender y utilizar los tipos mapeados, los desarrolladores pueden gestionar transformaciones de tipos complejas y garantizar una mayor seguridad de tipos en su código TypeScript. Los tipos mapeados ofrecen potentes capacidades para mejorar y personalizar las definiciones de tipos en aplicaciones TypeScript.