ProgrammazioneSviluppatore Frontend

Come funziona Pick in TypeScript, a cosa serve questo tipo di utilità e qual è la sua differenza rispetto a Omit?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Il tipo di utilità Pick<T, K> è stato aggiunto in TypeScript per affrontare il problema della copia selettiva di parte dei campi da un tipo o interfaccia esistente.

Storia della domanda

Spesso, durante lo sviluppo, vengono riutilizzate le stesse strutture dati con lievi variazioni. Prima dell'arrivo di Pick era necessario creare nuove interfacce copiando manualmente i campi desiderati, il che portava a duplicazione del codice e errori durante le successive modifiche delle strutture originali.

Problema

È necessario tipizzare i dati in ingresso o in uscita di una funzione utilizzando solo parte dei campi di una grande interfaccia, per evitare ridondanze e specificare al massimo il contratto.

Soluzione

Pick risolve il problema di estrarre un sottoinsieme delle proprietà di tipo T per chiavi K:

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

Esempio:

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

Caratteristiche chiave:

  • Crea un nuovo tipo con solo le chiavi necessarie;
  • Molto utile per la tipizzazione di query select, form, output;
  • Minimizza il numero di codice manuale e gli errori durante il refactoring.

Domande trabocchetto.

Qual è la differenza tra Pick e Omit?

Pick seleziona solo i campi elencati del tipo; Omit, al contrario, li esclude dalla struttura.

type PartialUser = Omit<User, 'id'>; // Tutti i campi tranne id

È possibile utilizzare Pick per selezionare una proprietà inesistente?

No, le chiavi K devono necessariamente essere le chiavi del tipo originale, altrimenti ci sarà un errore di compilazione.

Può Pick influire sull'opzionalità o sui campi readonly?

Pick mantiene i modificatori delle proprietà (optional, readonly), se erano nel tipo originale, semplicemente li copia nel nuovo.

Errori tipici e anti-pattern

  • Elencare in Pick esplicitamente come stringa ("id, name"), invece che come array di chiavi, portando a errori di compilazione.
  • Selezione di campi inesistenti o generazione automatica errata delle chiavi.
  • Uso di Pick dove è necessario escludere o modificare le proprietà — per questo ci sono Omit, Partial, Required.

Esempio della vita reale

Caso negativo

Durante il lavoro su un modulo di input, lo sviluppatore ha descritto manualmente il proprio tipo, dimenticando un nuovo attributo obbligatorio aggiunto in User. Il modulo ha smesso di funzionare dopo l'aggiornamento dell'interfaccia.

Pro:

  • Descrizione esplicita della struttura.

Contro:

  • Rischio di obsolescenza del typedef, alta probabilità di bug durante il refactoring.

Caso positivo

Viene utilizzato Pick per selezionare i campi necessari nel modulo:

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

Le modifiche in User si riflettono automaticamente nel modulo.

Pro:

  • Sincronizzazione garantita dei tipi.

Contro:

  • È necessario controllare di non selezionare campi aggiuntivi che non sono supportati nella logica di business del modulo.