Tipuri utilitare în TypeScript
TypeScript vine cu un set de tipuri ajutătoare încorporate care modifică sau refolosesc alte tipuri. Acestea se numesc tipuri utilitare.
Acest capitol le prezintă pe cele mai populare.
Partial
Partial preia un tip de obiect și face fiecare proprietate opțională.
Exemplu
Partial<Point> îți permite să pornești de la un obiect gol și să completezi x și y mai târziu.
Partial face opțională fiecare proprietate a unui tip de obiect.
Declară o interfață Point cu x: number și y: number, creează pointPart de tipul Partial<Point> pornind de la un literal de obiect gol, apoi atribuie pointPart.x = 10. Fișierul doar declară și atribuie; nu afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
interface Point {
x: number;
y: number;
}
let pointPart: Partial<Point> = {}; // `Partial` permite ca x și y să fie opționale
pointPart.x = 10;
Required
Required preia un tip de obiect și face fiecare proprietate obligatorie, chiar și pe cele marcate ca opționale cu ?.
Exemplu
mileage este opțională în Car, dar Required<Car> te obligă să îi dai o valoare.
Required transformă proprietățile opționale în proprietăți obligatorii.
Declară o interfață Car cu make: string, model: string și opționalul mileage?: number, apoi creează myCar de tipul Required<Car> cu make 'Ford', model 'Focus' și mileage 12000, adăugând un comentariu care spune că Required obligă ca mileage să fie definit. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
interface Car {
make: string;
model: string;
mileage?: number;
}
let myCar: Required<Car> = {
make: 'Ford',
model: 'Focus',
mileage: 12000 // `Required` obligă ca mileage să fie definit
};
Record
Record este o formă scurtă de a descrie un tip de obiect cu un singur tip pentru chei și un singur tip pentru valori.
Notă: Record<string, number> înseamnă același lucru cu { [key: string]: number }.
Exemplu
Fiecare cheie din nameAgeMap trebuie să fie un string, iar fiecare valoare trebuie să fie un număr.
Record folosit pentru a descrie o mapare de la chei de tip string la valori numerice.
Creează o constantă nameAgeMap de tipul Record<string, number> care conține 'Alice' cu 21 și 'Bob' cu 25. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
const nameAgeMap: Record<string, number> = {
'Alice': 21,
'Bob': 25
};
Omit
Omit elimină dintr-un tip de obiect cheile pe care le numești.
Exemplu
Omit<Person, 'age' | 'location'> lasă doar name, așa că age și location nu pot fi setate pe bob.
Omit elimină cheile numite dintr-un tip de obiect.
Declară o interfață Person cu name: string, age: number și opționalul location?: string, apoi creează bob de tipul Omit<Person, 'age' | 'location'> care conține doar numele 'Bob', însoțit de un comentariu care explică faptul că age și location au fost eliminate și nu pot fi definite aici. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
interface Person {
name: string;
age: number;
location?: string;
}
const bob: Omit<Person, 'age' | 'location'> = {
name: 'Bob'
// `Omit` a eliminat age și location din tip, așa că ele nu pot fi definite aici
};
Pick
Pick păstrează doar cheile pe care le numești și elimină tot restul dintr-un tip de obiect.
Exemplu
Pick<Person, 'name'> păstrează doar name, așa că age și location dispar din tip.
Pick păstrează doar cheile numite ale unui tip de obiect.
Declară o interfață Person cu name: string, age: number și opționalul location?: string, apoi creează bob de tipul Pick<Person, 'name'> care conține doar numele 'Bob', însoțit de un comentariu care explică faptul că a fost păstrat doar name, așa că age și location nu pot fi definite aici. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
interface Person {
name: string;
age: number;
location?: string;
}
const bob: Pick<Person, 'name'> = {
name: 'Bob'
// `Pick` a păstrat doar name, așa că age și location au fost eliminate din tip și nu pot fi definite aici
};
Exclude
Exclude elimină membri dintr-un tip uniune.
Exemplu
După Exclude<Primitive, string> valoarea poate fi un număr sau un boolean, dar nu un string.
Exclude elimină un membru dintr-un tip uniune.
Declară un alias de tip Primitive ca string | number | boolean, apoi creează o constantă value de tipul Exclude<Primitive, string> cu valoarea true, însoțită de un comentariu care menționează că un string nu poate fi folosit aici, deoarece Exclude l-a eliminat. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
type Primitive = string | number | boolean
const value: Exclude<Primitive, string> = true; // aici nu poate fi folosit un string, deoarece Exclude l-a eliminat din tip.
ReturnType
ReturnType preia un tip de funcție și îți dă tipul a ceea ce returnează acea funcție.
Exemplu
ReturnType<PointGenerator> este tipul de obiect { x: number; y: number; }.
ReturnType extrage tipul returnat al unui tip de funcție.
Declară un alias de tip PointGenerator pentru o funcție fără parametri care returnează { x: number; y: number; }, apoi creează o constantă point de tipul ReturnType<PointGenerator> cu x 10 și y 20. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
type PointGenerator = () => { x: number; y: number; };
const point: ReturnType<PointGenerator> = {
x: 10,
y: 20
};
Parameters
Parameters preia un tip de funcție și îți dă tipurile parametrilor săi sub forma unui tuplu (un tip de tablou). Îl poți indexa pentru a obține tipul unui singur parametru.
Exemplu
Parameters<PointPrinter>[0] este tipul primului parametru: { x: number; y: number; }.
Parameters extrage tipurile parametrilor unui tip de funcție sub forma unui tuplu.
Declară un alias de tip PointPrinter pentru o funcție care primește p: { x: number; y: number; } și returnează void, apoi creează o constantă point de tipul Parameters<PointPrinter>[0] cu x 10 și y 20. Nu se afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
type PointPrinter = (p: { x: number; y: number; }) => void;
const point: Parameters<PointPrinter>[0] = {
x: 10,
y: 20
};
Readonly
Readonly creează un tip nou în care fiecare proprietate este doar pentru citire. Odată ce o proprietate are o valoare, aceasta nu mai poate fi schimbată.
Notă: TypeScript oprește modificarea doar la compilare. Codul JavaScript compilat nu are o astfel de protecție, așa că o proprietate readonly poate fi totuși suprascrisă la rulare.
Exemplu
Atribuirea unui nou name unui Readonly<Person> este o eroare de compilare.
Readonly blochează atribuirea către proprietăți după creare.
Declară o interfață Person cu name: string și age: number, creează o constantă person de tipul Readonly<Person> cu name "Dylan" și age 35, apoi încearcă să atribui 'Israel' lui person.name. Păstrează acea linie, astfel încât compilatorul să raporteze eroarea TS2540 (nu se poate atribui unei proprietăți doar pentru citire).
Ieșire: program TypeScript și rezultatul capturat
interface Person {
name: string;
age: number;
}
const person: Readonly<Person> = {
name: "Dylan",
age: 35,
};
person.name = 'Israel'; // prog.ts(11,8): error TS2540: Cannot assign to 'name' because it is a read-only property.