Cómo crear y utilizar tipos de utilidades de TypeScript

TypeScript proporciona un conjunto de tipos de utilidad que facilitan la transformación y la gestión de los tipos existentes. Estos tipos de utilidad integrados permiten a los desarrolladores manipular los tipos de diversas formas, lo que ayuda a simplificar el código y evitar la repetición. Esta guía explora algunos de los tipos de utilidad más comunes y cómo se pueden crear y utilizar en un proyecto TypeScript.

¿Qué son los tipos de utilidad de TypeScript?

Los tipos de utilidad en TypeScript son tipos predefinidos que ayudan a transformar otros tipos. Se pueden utilizar para crear nuevos tipos basados ​​en los existentes, ya sea seleccionando, omitiendo o modificando propiedades. Desempeñan un papel esencial en el mantenimiento de un código limpio y reutilizable.

Tipos de utilidades de TypeScript de uso común

A continuación se muestran algunos de los tipos de utilidades TypeScript más utilizados:

  • Parcial<T> – Hace que todas las propiedades del tipo T sean opcionales.
  • Obligatorio<T> – Hace que todas las propiedades del tipo T sean obligatorias.
  • Solo lectura<T> – Hace que todas las propiedades del tipo T sean de solo lectura.
  • Pick<T, K> – Selecciona un conjunto de propiedades K del tipo T.
  • Omitir<T, K> – Elimina un conjunto de propiedades K del tipo T.
  • Registro<K, T> – Construye un tipo de objeto con claves de tipo K y valores de tipo T.

Ejemplo: Uso parcial<T>

El tipo de utilidad Partial hace que todas las propiedades de una interfaz sean opcionales. A continuación, se muestra cómo se puede utilizar:

interface User {
  name: string;
  age: number;
  email: string;
}

const updateUser = (user: Partial<User>) => {
  // Update logic
};

updateUser({ name: "John" });

En este ejemplo, updateUser acepta un argumento de tipo Partial<User>, lo que significa que solo se requieren algunas de las propiedades de la interfaz User.

Ejemplo: Uso de Pick<T, K>

El tipo de utilidad Seleccionar permite seleccionar un subconjunto de propiedades de un tipo:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserContactInfo = Pick<User, "name" | "email">;

const contactInfo: UserContactInfo = {
  name: "John",
  email: "john@example.com"
};

Aquí, Pick<User, “name” | “email”> crea un nuevo tipo UserContactInfo con solo las propiedades name y email de la interfaz User original.

Ejemplo: Uso de Omit<T, K>

El tipo de utilidad Omit elimina propiedades específicas de un tipo:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserWithoutEmail = Omit<User, "email">;

const user: UserWithoutEmail = {
  name: "John",
  age: 30
};

En este ejemplo, el tipo UserWithoutEmail se crea omitiendo la propiedad email de la interfaz User.

Creación de tipos de utilidades personalizados

También se pueden crear tipos de utilidad personalizados mediante las funciones de tipo avanzadas de TypeScript, como tipos condicionales, tipos mapeados y más. A continuación, se muestra un ejemplo simple de un tipo de utilidad personalizado que hace que todas las propiedades sean opcionales:

type MyPartial<T> = {
  [P in keyof T]?: T[P];
};

interface User {
  name: string;
  age: number;
  email: string;
}

const user: MyPartial<User> = {
  name: "Alice"
};

Este tipo personalizado MyPartial funciona de manera similar al tipo de utilidad Partial incorporado de TypeScript.

Conclusión

Los tipos de utilidad de TypeScript son una característica esencial para trabajar con tipos de una manera flexible y reutilizable. Al aprovechar estos tipos de utilidad, el código puede volverse más conciso y fácil de mantener. Ya sea que se utilicen tipos de utilidad integrados como Partial, Pick y Omit o se creen tipos personalizados, mejoran significativamente el sistema de tipos de TypeScript.