Utility Types en TypeScript

Utility Types en TypeScript

Índice de contenidos

  1. Introducción
  2. Partial
  3. Pick
  4. Omit
  5. Record
  6. Exclude
  7. Extract
  8. Required
  9. Readonly
  10. NonNullable
  11. ReturnType
  12. Awaited
  13. Conclusión

Introducción

Como vimos en mi último articulo en el que hablaba sobre genéricos en Typescript, TypeScript no se limita al tipado estático simple, si no que nos proporciona una gran cantidad de herramientas que nos agilizan el desarrollo y hacen este más legible y simple.

En este artículo te voy a enseñar algunas de sus utilidades que te van a ayudar a mejorar tus desarrollos. Vamos a ello:

Partial

Text
Partial

nos permite tipar haciendo opcionales todas las propiedades del genérico que recibe como tipo. Podríamos decir que transforma un tipado estricto donde tienes que implementar todas las propiedades en un tipado menos agresivo donde te permite ‘elegir’ las propiedades que necesites.


Text
interface TShirt {
        size: string,
        color: string,
        frontText: string,
        backText: string
}

const customTShirt: Partial<TShirt> = {
        size: 'Small',
        color: 'blue'
        frontText: 'Change de future'
}

const otherCustomTShirt: Partial<TShirt> = {
        size: 'Large',
        color: 'green'
        backText: 'Change de future'
}

Pick

Text
Pick

nos permite tipar seleccionando las propiedades que queramos del genérico que le proporcionamos. Es decir, es como una versión simplificada.


Text
type BasicTShirt = Pick<TShirt, 'size' | 'color'>

const basicTShirt: BasicTShirt = {
        size: 'Large',
        color: 'white'
}

Omit

Text
Omit

nos permite tipar omitiendo las propiedades que le indiquemos del genérico que le proporcionamos. Digamos que funciona igual que

Text
Pick

pero esta vez las propiedades que le indicamos son las que no queremos que se incluyan en el nuevo tipo.


Text
type TShitContent = Omit<TShirt, 'size' | 'color'>

const basicTShirt: BasicTShirt = {
        frontText: 'Change de future',
        backText: 'Change de future'
}

Record

Text
Record

nos permite tipar especificando el tipo de claves y el tipo de valor. Este caso se entiende mejor viendo un ejemplo.


Text
interface TShirtModel {
        color: string,
        frontText: string,
        backText: string
}

type Seasons = "summer" | "winter" | "spring" | "autumn"

const collections: Record<Seasons, TShirtModel> = {
    summer: { color: 'orange' , frontText: 'Summer', backText: 'Summer days'},
    winter: { color: 'blue' , frontText: 'Winter', backText: 'Winter days'},
    spring: { color: 'green' , frontText: 'Spring', backText: 'Spring days'},
    autumn: { color: 'brown' , frontText: 'Autumn', backText: 'Autumn days'},
}

Exclude

Text
Exclude

nos permite tipar excluyendo el tipo que le pasamos como segundo argumento al genérico que recibe como primer argumento.


Text
interface TShirt {
        size: string,
        color: string,
        frontText: string,
        backText: string
}

interface DeliveryPoint {
        address: string,
        city: string,
        postalCode: string
}

interface PaymentMethod {
        type: string,
        provider: string
}

type FullOrderInformation = TShirt & DeliveryPoint & PaymentMethod

const fullInfo: FullOrderInformation = {
        size: 'Medium',
        color: 'Black',
        frontText: 'Hello',
        backText: 'Bye',
        address: 'some direction',
        city: 'Madrid',
        postalCode: '32556',
        type: 'Credit Card',
        provider: 'Visa'
}

type DistrubutorInformation = Exclude<FullOrderInformation, PaymentMethod>

const distributorInfo: DistributorInformation = {
        size: 'Medium',
        color: 'Black',
        frontText: 'Hello',
        backText: 'Bye',
        address: 'some direction',
        city: 'Madrid',
        postalCode: '32556'
}

Extract

Text
Extract

nos permite tipar manteniendo las propiedades que se pueden asignar al tipo extraído.

Podríamos decir que extract busca las propiedades comunes entre los tipos proporcionados.


Text
type TShirtMaterials = 'Cotton' | 'Polyester' | 'Linen'

type PantMaterials = 'Cotton' | 'Polyester' | 'Nylon'

type CommonMaterials = Extract<TShirtMaterials, PantMaterials>

const commonMaterials: CommonMaterials = 'Cotton' | 'Polyester'

Required

Text
Required

establece todas las propiedades del tipo como requeridas.


Text
interface TShirt {
        size: string,
        color: string,
        frontText?: string,
        backText?: string
}

type FrontAndBackTextTShirt = Required<TShirt>

const basicTShirt: TShirt = {
        size: 'Large'
        color: 'yellow'
}

const otherTShirt: FrontAndBackTextTShirt = {
        size: 'Large'
        color: 'yellow'
}
// Esto daría error

Readonly

Text
Readonly

establece que todas las propiedades del genérico recibido sean únicamente de lectura, es decir, no podrán ser modificadas.


Text
interface TShirt {
        size: string,
        color: string,
        frontText?: string,
        backText?: string
}

let sampleTShirt: ReadOnly<TShirt> = {
  size: 'Medium',
        color: 'black'
}

sampleTShirt.color = 'red'
//Esto daría error ya que color no se puede sobrescribir

NonNullable

Text
NonNullable

nos permite tipar eliminando la posibilidad de tener propiedades

Text
null

o

Text
undefined

en el genérico que recibe.


Text
type TShirtText = string | undefined

type SureTShirtText = NonNullable<TShirtText>

interface FrontAndBackTextTShirt {
        size: string,
        color: string,
        frontText: SureTShirtText,
        backText: SureTShirtText
}

const someTShirt:FrontAndBackTextTShirt = {
        size: 'Small',
        color: 'grey',
        frontText: undefined, //Error ya que no puede ser ni null ni undefined
        backText: 'something'
}

ReturnType

Text
ReturnType

nos permite obtener el tipo de los datos que devuelve una función.


Text
type BasicTShirt = {
        size: string,
        color: string
}

function getSampleTShirt(): BasicTShirt {
        ...some action
}

type SampleTShirt = ReturnType<typeof getSampleTShirt>
// { size: string, color: string }

Awaited

Text
Awaited

extrae el tipo que se resuelve de una promesa que es devuelta por una función.


Text
async function getTShirtsQry(): Promise<TShirt[]> {
  ...some action
}

type TShirtList = Awaited<typeof getTShirtsQry>;

async function getTShirts(): Promise<void> {
  const listOfTShirts: TShirtList = await getTShirtsQry();
  // ... some action with this t-shirts
}

Conclusión

En este articulo hemos explorado las Utility Types mas interesantes que tiene TypeScript a día de hoy. Te animo a intentar utilizarlas, te aseguro una vez las tengas dominadas, verás que agilizan tu desarrollo y luego no podrás vivir sin algunas de ellas.

Gracias por tu atención 😊

Comentarios

2 respuestas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Actualmente frontend developer en Autentia. Soy una persona activa, positiva, apasionada del diseño, a la que le gusta aprender.

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

10/06/2025

Iván Suarez Romero

Aprende cómo migrar tu sitio Joomla 3 a Joomla 5 de forma segura, manteniendo el diseño, la funcionalidad y compatibilidad con extensiones. Una guía paso a paso con recomendaciones, imágenes y buenas prácticas para actualizar sin sorpresas.

04/06/2025

Gonzalo Matarrubia González

Descubre qué es Yocto Project, sus ventajas, usos reales en Izertis y cómo crear tu propia distribución Linux para Raspberry Pi paso a paso, de forma sencilla y flexible.

30/05/2025

Roberto José

¿Trabajas con Drupal y SonarQube 9.9? En este artículo exploramos cómo adaptar el análisis estático para evitar falsos positivos, desactivar reglas conflictivas del Quality Profile y delegar el estilo a PHP CodeSniffer. Una guía práctica para mejorar la integración sin depender aún de SonarQube 10.