Utility types son herramientas integradas de TypeScript para transformar, modificar o derivar tipos a partir de tipos existentes. Los más comunes son:
Partial<T> — hace que todas las propiedades del tipo T sean opcionalesRequired<T> — hace que todas las propiedades sean obligatoriasPick<T, K> — selecciona solo las propiedades K del tipo TOmit<T, K> — excluye del tipo T las propiedades Ktype User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;
Esto permite crear APIs y DTOs más flexibles.
Si una propiedad del tipo se indica como opcional (
age?: number), ¿cómo se comportará Required<T>? ¿Seguirá siendo opcional?
Respuesta: No, Required<T> transforma todas las propiedades del tipo T, incluidas las opcionales, en obligatorias (requeridas).
type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }
Historia
Se utilizó Partial<T> para actualizar objetos, pensando que esto era automáticamente seguro para la base de datos. Se olvidaron de verificar los campos en null/undefined y obtuvieron errores de validación al actualizar entidades.
Historia
Se utilizó Omit<T, K> para excluir propiedades técnicas del tipo de solicitud, sin considerar que al refactorizar el modelo, los nuevos campos técnicos no se habían añadido a la lista de exclusiones. Como resultado, los campos privados "se filtraron" a través de la API.
Historia
En la biblioteca compartida se creó un tipo Pick<T, K>, equivocándose en la lista de claves: K faltaba parcialmente en el tipo original. TypeScript pasó por alto el error al usar cadenas literales, pero al cambiar el tipo original surgió una discrepancia y parte de los tipos "se rompieron" en todos los servicios.