3 formas de transformar tipos en TypeScript

Cuando usamos tipos o interfaces, el compilador de TypeScript se asegura de que el objeto cumpla exactamente con esa estructura para evitar errores en tiempo de ejecución por propiedades faltantes.
A veces queremos tener la flexibilidad de crear un objeto sin romper el contrato definido con la interfaz.
Por ejemplo, imagina que tenemos la interfaz User con todas sus propiedades obligatorias:
interface User {
username: string;
password: string;
roles: string[];
active: boolean;
}Quizás queremos crear un usuario primero y más adelante llamar a la API para obtener sus roles. Si intentamos crear el objeto sin todas las propiedades requeridas, el compilador nos muestra un error porque no encaja con la interfaz.
En muchos casos, caemos en la tentación de cambiar la propiedad a opcional con roles?: string[] para que compile, pero en el fondo sabemos que es una trampa.
TypeScript nos ofrece herramientas para manejar este escenario:
Partial: crea un nuevo tipo donde todas las propiedades del tipo original se vuelven opcionales:
let admin: Partial<User> = {
username: 'admin',
password: 'admin'
}Gracias a una aportación de @lukeshiru, aprendí otras formas de abordar esto:
Partialhace que absolutamente todas las propiedades sean opcionales, y muchas veces eso no es lo que queremos.
TypeScript también nos ofrece otros utility types como Omit y Pick. Vamos a ver cómo funcionan.
Omit: crea un nuevo tipo tomando todas las propiedades del tipo original y quitando las claves que especifiquemos.
type UserWithoutRoles = Omit<User, "roles">;
const userWithoutRoles: UserWithoutRoles = {
username: "admin",
password: "admin",
};Pick: crea un nuevo tipo a partir de un tipo existente seleccionando únicamente un grupo de propiedades.
type UserWithStatus = Pick<User, "username" | "active">
const userWithStatus: UserWithStatus = {
username: "dany",
active: true
}¡Muchas gracias de nuevo a @lukeshiru por el aporte! :)
Consulta más información sobre los Utility Types de TypeScript. Una vez que transformes tus tipos, es muy probable que también necesites validarlos en tiempo de ejecución: revisa mi guía práctica sobre cómo verificar tipos en TypeScript para aprender sobre type narrowing y custom type guards.
Lee más artículos en danywalls.com. Foto de Suzi Kim en Unsplash
Modern frontend development — Angular, React, TypeScript, accessibility, and performance.
Preguntas Frecuentes
¿Qué es el utility type Partial en TypeScript y cuándo debería usarlo?
Partial es un utility type de TypeScript que crea un nuevo tipo donde todas las propiedades del tipo original se vuelven opcionales. Lo usas cuando necesitas crear un objeto que solo tiene algunos de los campos definidos en una interfaz, como al armar los datos para una actualización parcial o al construir un objeto paso a paso antes de tener toda la información disponible.
¿Cuál es la diferencia entre Omit y Pick en TypeScript?
Omit crea un nuevo tipo tomando todas las propiedades de un tipo existente y eliminando las que especifiques por su nombre. Pick crea un nuevo tipo seleccionando únicamente las propiedades específicas que indiques. Usa Omit cuando quieras la mayor parte del tipo pero necesites excluir unos pocos campos, y usa Pick cuando solo necesites un subconjunto pequeño de propiedades de un tipo más grande.
¿Cómo creo un tipo en TypeScript que excluya ciertas propiedades de una interfaz?
Usa el utility type Omit escribiendo Omit seguido del tipo de origen y una unión con los nombres de las propiedades que quieres excluir. Por ejemplo, Omit con el tipo User y la propiedad roles generará un nuevo tipo con todas las propiedades de User excepto roles. El resultado es un objeto completamente tipado que el compilador validará como cualquier otro tipo.
¿Por qué debería usar utility types en TypeScript en lugar de hacer las propiedades opcionales con un signo de interrogación?
Hacer una propiedad opcional con un signo de interrogación cambia el contrato de la interfaz original de forma permanente, lo que puede ocultar errores en otras partes del código donde esa propiedad sí debería estar presente. Los utility types como Partial, Omit y Pick te permiten crear tipos derivados para casos de uso específicos sin modificar la interfaz base, manteniendo tus tipos precisos y tu código más seguro.
Artículos Relacionados
Cómo comprobar tipos en TypeScript (Guía completa)
Aprende cómo comprobar y validar tipos en TypeScript en tiempo de compilación y en tiempo de ejecución usando typeof, instanceof, el operador in, uniones discriminadas, type guards personalizados y Zod o Valibot.
Clases abstractas en TypeScript
En TypeScript, las clases pueden heredar de otras para compartir métodos y propiedades. Además, TypeScript permite usar clases abstractas. Te muestro por qué y cuándo utilizarlas con un ejemplo práctico.
Diferencia entre 'extends' e 'implements' en TypeScript
Hoy un amigo me preguntó sobre la diferencia entre extends e implements. class Media { format: string; } class Video extends Media {} class Image implements Media {} La respuesta rápida para él fue: con extends la clase obtiene todos los métodos y propiedades del padre, mientras que con implements la clase debe implementarlos.
Cómo probar métodos privados en TypeScript
Aprende cuatro formas prácticas de probar métodos privados en TypeScript, comprende las diferencias entre private de TypeScript y los campos privados de JavaScript, y conoce las mejores prácticas.
Compartir este artículo
Si esta guía te resultó útil, compártela con tu equipo o con otros desarrolladores.
Software real. Lecciones reales.
Comparto las lecciones que aprendí por las malas, para que puedas evitarlas o estar preparado cuando ocurran.
Únete a 13,800+ desarrolladores y lectores.
Cero spam. Cancela tu suscripción en cualquier momento.