February 5, 2026
¿Qué son los Utility Types en TypeScript? Guía completa con ejemplos
TypeScript ha revolucionado la forma en que escribimos JavaScript, aportando seguridad y robustez gracias a su sistema de tipos estático. Sin embargo, a medida que una aplicación crece, es común encontrarse reescribiendo interfaces que son casi idénticas a otras ya existentes. Aquí es donde entran en juego los Utility Types.
Si alguna vez has creado una interfaz para un usuario y luego otra casi igual (pero con campos opcionales) para el formulario de edición, necesitas conocer estas herramientas.
¿Qué son exactamente?
Los Utility Types son herramientas integradas en TypeScript que facilitan la transformación de tipos existentes en otros nuevos. Piensa en ellos como funciones, pero en lugar de operar con valores, operan con tipos. Reciben un tipo genérico como entrada y devuelven una versión modificada del mismo.
Su objetivo principal es adherirse al principio DRY (Don't Repeat Yourself), evitando la duplicación innecesaria de interfaces y reduciendo la deuda técnica.
A continuación, exploraremos los más utilizados en el desarrollo profesional.
1. Partial<T>
Quizás el más común. Partial toma un tipo T y convierte todas sus propiedades en opcionales. Es extremadamente útil para funciones de actualización (patch) donde no necesitas enviar el objeto completo, sino solo los campos que han cambiado.
interface Usuario {
id: number;
nombre: string;
email: string;
}
// Sin Partial, tendríamos que pasar el objeto completo o crear una interfaz nueva
function
2. Required<T>
Es el opuesto exacto de Partial. Convierte todas las propiedades de un tipo en obligatorias, incluso aquellas definidas originalmente como opcionales (con ?).
interface Configuracion {
tema?: 'oscuro' | 'claro';
notificaciones?: boolean;
}
// Aquí forzamos que el objeto tenga TODAS las propiedades
const configCompleta:3. Pick<T, K>
Pick nos permite construir un nuevo tipo seleccionando un subconjunto de propiedades (K) de un tipo existente (T). Es ideal cuando necesitas exponer solo ciertos datos de un modelo grande, por ejemplo, para una vista previa de una tarjeta de producto.
interface Producto {
id: number;
nombre: string;
descripcion: string;
precio: number;
stock: number
4. Omit<T, K>
La contraparte de Pick. En lugar de seleccionar qué quedarnos, Omit nos permite especificar qué propiedades queremos excluir de un tipo. Es muy útil para limpiar objetos antes de enviarlos al frontend, como eliminar datos sensibles.
interface Empleado {
id: number;
nombre: string;
salario: number; // Dato sensible
claveAcceso: string; // Dato sensible
5. Record<K, T>
Record es fundamental para definir diccionarios o mapas de objetos. Permite definir un objeto donde las claves son de un tipo específico (K) y los valores de otro (T). Es mucho más seguro y limpio que usar el genérico any o {}.
type Pagina = 'inicio' | 'nosotros' | 'contacto';
interface InfoPagina {
titulo: string;
url: string
6. Readonly<T>
Si trabajas con programación funcional o gestión de estado (como Redux), Readonly es tu mejor aliado. Marca todas las propiedades de un tipo como de "solo lectura", impidiendo su reasignación después de la creación.
interface Tarea {
titulo: string;
}
const miTarea: Readonly<Tarea> = {
titulo: "Aprender TypeScript"
}
Conclusión
Los Utility Types no son solo "azúcar sintáctico"; son herramientas poderosas para modelar datos de manera eficiente. Utilizarlos correctamente te permitirá:
- Reducir código: Menos interfaces duplicadas.
- Aumentar la seguridad: Los cambios en la interfaz "padre" se propagan automáticamente a los tipos derivados.
- Mejorar la legibilidad: Otros desarrolladores entenderán inmediatamente la intención del tipo (ej.
Partial<User>se explica solo).
Empieza a refactorizar tus interfaces hoy mismo utilizando Pick, Omit y Partial, y verás cómo tu base de código se vuelve mucho más mantenible.

Written by Pol Valle
I am particularly drawn to developing applications that are not only functional but also visually appealing and easy to use. I accomplish this by implementing SOLID principles and clean architecture, and applying testing to ensure quality.