Menu

Pick en TypeScript: seleccionar propiedades de un tipo

Pick<T, K> crea un tipo solo con las propiedades de T cuyas claves están en K. Aprende Pick con una o varias claves, cómo comprueba las claves, Pick frente a Omit, cómo seleccionar de tipos anidados, una función pick() tipada y cómo seleccionar propiedades por el tipo de su valor.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Pick<T, K> es un utility type integrado que crea un tipo objeto solo con las propiedades de T nombradas en K. Úsalo cuando una función o un componente necesita unos pocos campos de un tipo más grande:

renderPreview acepta un User completo y también un objeto { id, name } sin más, porque solo pide lo que usa. Eso hace que sea más fácil de llamar y de probar. Pick solo afecta a los tipos: el objeto ada completo sigue teniendo sus cinco propiedades en ejecución.

Sintaxis y comprobación de claves

Pick<Type, Keys>

Keys es una sola clave o una unión de claves, y cada una tiene que existir en Type. La definición de la librería estándar de TypeScript lo convierte en una restricción:

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

Gracias a K extends keyof T, una clave mal escrita o inexistente es un error de compilación, y tu editor puede autocompletar los nombres de las claves:

El error es error TS2344: Type '"cost"' does not satisfy the constraint 'keyof Product'. Es una diferencia con Omit, cuyas claves no se comprueban.

Pick conserva readonly y opcional

Pick recorre claves de T, así que cada propiedad seleccionada conserva sus modificadores:

La última línea muestra { id: 8 } porque readonly es solo una comprobación de compilación: la asignación se detectó, se suprimió con @ts-expect-error y aun así se ejecutó. Para cambiar los modificadores al seleccionar, envuelve el resultado: Partial<Pick<Account, "plan">> o Required<Pick<Account, "email">>.

Pick frente a Omit

Pick nombra lo que se conserva; Omit, lo que se descarta. Hoy los dos dan el mismo resultado, pero se comportan distinto cuando crece el tipo de origen:

Pick<T, K>Omit<T, K>
Enumeraslas claves que se conservanlas claves que se quitan
Propiedades nuevas en Tno se incluyense incluyen automáticamente
Clave desconocida en Kerror de compilación (TS2344)se acepta sin avisar
Sirve pararespuestas de API, vistas públicas, props«todo menos el secreto»

Para los datos que salen de tu servidor, Pick es la opción más segura por defecto: nada aparece en el tipo salvo que alguien lo haya añadido a propósito.

Seleccionar de tipos anidados

Pick solo ve las claves del primer nivel: una ruta con puntos como Pick<Customer, "address.city"> es un error (TS2344), no una selección anidada. Usa un indexed access type para llegar al tipo anidado y selecciona de él:

Customer["address"] es el tipo de la propiedad address. La misma sintaxis llega a los elementos de un array: para una propiedad orders: Order[], Customer["orders"][number] es Order.

Una función pick() tipada

Pick no hace nada en ejecución. Una pequeña función genérica copia las propiedades elegidas en un objeto nuevo y devuelve exactamente Pick<T, K>:

K extends keyof T permite que TypeScript infiera K a partir de los argumentos string, así que el tipo de retorno tiene exactamente las claves seleccionadas. La aserción {} as Pick<T, K> hace falta porque un objeto vacío todavía no tiene esas propiedades; el bucle las rellena.

Seleccionar propiedades por el tipo de su valor

Pick selecciona por nombre de clave. Para seleccionar por el tipo de la propiedad, por ejemplo «todos los campos string», escribe un mapped type con un filtro de claves:

La cláusula as convierte cada clave en sí misma cuando su tipo encaja y en never en caso contrario, y las claves never se descartan. Un detalle: el tipo de una propiedad opcional incluye undefined, así que un subtitle?: string opcional no contaría aquí como string; compara con string | undefined para incluirlo.

Preguntas frecuentes

¿Qué hace Pick en TypeScript?

Pick<T, K> construye un tipo objeto que contiene solo las propiedades de T cuyas claves están en K. Pick<User, "id" | "name"> es { id: number; name: string } cuando User tiene esas dos propiedades y otras más. Solo trabaja con tipos y no quita nada de los objetos en tiempo de ejecución.

¿Qué diferencia hay entre Pick y Omit?

Pick enumera las propiedades que se conservan y Omit las que se quitan. Cuando el tipo de origen gana una propiedad, Omit la incluye automáticamente y Pick no. Además, Pick comprueba que sus claves existan en el tipo; Omit acepta cualquier clave.

¿Cómo selecciono varias propiedades en TypeScript?

Pasa una unión de claves: Pick<User, "id" | "name" | "email">. Todas las claves tienen que existir en User, o el compilador informa el error TS2344.

¿Cómo selecciono una propiedad anidada en TypeScript?

Pick solo selecciona propiedades del primer nivel. Llega al tipo anidado con un indexed access type y selecciona de ahí: Pick<User["address"], "city">. Para conservar el anidamiento, combínalos: Pick<User, "id"> & { address: Pick<User["address"], "city"> }.

¿Pick conserva los modificadores readonly y opcional?

Sí. Pick es un mapped type sobre claves de T, así que una propiedad que es readonly u opcional en T sigue siéndolo en el tipo seleccionado.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR