ProgramaciónDesarrollador Frontend

¿Cómo funciona Pick en TypeScript, para qué se necesita este tipo utilitario y en qué se diferencia de Omit?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

El tipo utilitario Pick<T, K> se agregó en TypeScript para resolver la tarea de copiar selectivamente parte de los campos de un tipo o interfaz existente.

Contexto

A menudo, durante el desarrollo, se reutilizan las mismas estructuras de datos con ligeras variaciones. Antes de la aparición de Pick, era necesario crear nuevas interfaces copiando manualmente los campos necesarios, lo que llevaba a la duplicación de código y a errores al modificar las estructuras originales.

Problema

Es necesario tipificar los datos de entrada o salida de una función, utilizando solo una parte de los campos de una gran interfaz, para evitar redundancias y especificar al máximo el contrato.

Solución

Pick resuelve la tarea de seleccionar un subconjunto de propiedades del tipo T por las claves K:

type Pick<T, K extends keyof T> = { [P in K]: T[P] };

Ejemplo:

interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };

Características clave:

  • Crea un nuevo tipo con solo las claves necesarias;
  • Muy conveniente para tipificar consultas select, formularios, resultados;
  • Minimiza la cantidad de código manual y errores durante el refactorizado.

Preguntas engañosas.

¿En qué se diferencia Pick de Omit?

Pick selecciona solo los campos enumerados del tipo; Omit, por el contrario, los excluye de la estructura.

type PartialUser = Omit<User, 'id'>; // Todos los campos excepto id

¿Se puede usar Pick para seleccionar una propiedad que no existe?

No, las claves K deben ser necesariamente claves del tipo original, de lo contrario, habrá un error de compilación.

¿Puede Pick afectar la opcionalidad o los campos readonly?

Pick conserva los modificadores de propiedad (optional, readonly) si estaban en el tipo original, solo los copia en el nuevo.

Errores típicos y anti-patrones

  • Enumerar en Pick explícitamente como cadena ("id, name"), en lugar de un array de claves, lo que provoca errores de compilación.
  • Seleccionar campos no existentes o generación automática incorrecta de claves.
  • Usar Pick donde se requiere excluir o modificar propiedades — para eso están Omit, Partial, Required.

Ejemplo de la vida real

Caso negativo

Al trabajar con un formulario de entrada de datos, el desarrollador describió su propio tipo manualmente, olvidando el nuevo atributo obligatorio agregado en User. El formulario dejó de funcionar después de la actualización de la interfaz.

Ventajas:

  • Descripción explícita de la estructura.

Desventajas:

  • Riesgo de obsolescencia de typedef, alta probabilidad de errores durante el refactorizado.

Caso positivo

Se utiliza Pick para seleccionar los campos necesarios del formulario:

type FormFields = Pick<User, 'email' | 'name'>;

Los cambios en User se reflejan automáticamente en el formulario.

Ventajas:

  • Sincronización garantizada de tipos.

Desventajas:

  • Es necesario controlar para no seleccionar campos adicionales que no son soportados en la lógica de negocio del formulario.