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ă
Pickscoate proprietățile și din obiect la rulare. Tipul doar restrânge ce poți folosi; obiectulanadat luicardare în continuarecnp.
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.