ProgramaciónDesarrollador Fullstack

¿Qué son los 'utility types' en TypeScript (por ejemplo, Partial, Required, Pick, Omit), dónde y cómo deben aplicarse, y qué errores se cometen frecuentemente al usarlos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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 opcionales
  • Required<T> — hace que todas las propiedades sean obligatorias
  • Pick<T, K> — selecciona solo las propiedades K del tipo T
  • Omit<T, K> — excluye del tipo T las propiedades K

Ejemplo de uso:

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

Pregunta trampa

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 }

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema


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.