Pick în TypeScript

Pick<T, K> păstrează din T doar proprietățile cu numele din K.

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

Ce face Pick

Pick<T, "a" | "b"> creează un tip care are doar proprietățile a și b din T, cu tipurile lor originale. Numele trebuie să existe în T; o greșeală de scriere este eroare de compilare.

Îl folosești când o funcție are nevoie doar de o parte din date: un card de profil care afișează nume și oras, un rezumat de produs. Tipul rămâne legat de interfața originală: dacă se schimbă tipul unei proprietăți acolo, se schimbă și în Pick.

Perechea lui este Omit, care elimină proprietăți în loc să le păstreze. Alege-l pe cel cu lista mai scurtă.

Parametri

Parametru Descriere
T Tipul obiect din care alegi proprietăți.
K Un union cu numele proprietăților păstrate. Trebuie să fie chei din T.

Ce returnează

Un tip obiect cu doar proprietățile K din T.

Exemple

Exemplul 1: Doar datele necesare pentru afișare

interface Elev {
    id: number;
    nume: string;
    oras: string;
    cnp: string;
    note: number[];
}
type CardElev = Pick<Elev, "nume" | "oras">;

function card(e: CardElev): string {
    return `${e.nume} (${e.oras})`;
}

const ana: Elev = { id: 1, nume: "Ana", oras: "Iași", cnp: "2950101123456", note: [10] };
console.log(card(ana));                          // un Elev are tot ce cere CardElev
console.log(card({ nume: "Mihai", oras: "Cluj" }));

Rezultat

Ana (Iași)
Mihai (Cluj)

Exemplul 2: Selecție generică de câmpuri

Funcția returnează exact tipul Pick pentru cheile date.

function alege<T, K extends keyof T>(obiect: T, ...chei: K[]): Pick<T, K> {
    const rezultat = {} as Pick<T, K>;
    for (const k of chei) rezultat[k] = obiect[k];
    return rezultat;
}

const produs = { id: 7, nume: "Cafea", pret: 32, stoc: 140, furnizor: "SC Exemplu SRL" };
const public_ = alege(produs, "nume", "pret");      // { nume: string; pret: number }
console.log(public_);

Rezultat

{ nume: 'Cafea', pret: 32 }

Exemplul 3: Cheie inexistentă

interface Elev {
    nume: string;
    oras: string;
}
type T = Pick<Elev, "nume" | "varsta">;
const t: T = { nume: "Ana" };
console.log(t);

Eroarea afișată de tsc

exemplu.mts(5,21): error TS2344: Type '"nume" | "varsta"' does not satisfy the constraint 'keyof Elev'.
  Type '"varsta"' is not assignable to type 'keyof Elev'.
exemplu.mts(6,7): error TS2741: Property 'varsta' is missing in type '{ nume: string; }' but required in type 'T'.

Greșeli frecvente

  • Crezi că Pick scoate proprietățile și din obiect la rulare. Tipul doar restrânge ce poți folosi; obiectul ana dat lui card are în continuare cnp.

Comenzi înrudite

  • Omit: Omit<T, K> creează un tip cu toate proprietățile lui T, mai puțin cele cu numele din K.
  • Partial: Partial<T> face toate proprietățile lui T opționale; util pentru actualizări în care trimiți doar ce se schimbă.
  • keyof: keyof T dă union-ul numelor de proprietăți ale lui T, de exemplu „nume” | „oras”.
  • indexed access (T[K]): T[„cheie”] dă tipul unei proprietăți din T; T[number] dă tipul elementelor unui tablou.
  • Record: Record<K, T> descrie un obiect ale cărui chei sunt K și ale cărui valori au toate tipul T.