Ce face constructor parameter properties
Dacă pui public, private, protected sau readonly în fața unui parametru al constructorului, TypeScript creează un câmp cu același nume și îi dă valoarea parametrului. constructor(public nume: string) {} înlocuiește trei rânduri: declararea câmpului, parametrul și atribuirea this.nume = nume.
Se pot amesteca parametri obișnuiți (fără modificator, doar pentru constructor) cu parameter properties. Corpul constructorului poate să fie gol sau să conțină alt cod; atribuirile automate se fac la începutul lui (după super(...) în clasele derivate).
Este o sintaxă specifică TypeScript care generează cod: opțiunea erasableSyntaxOnly o interzice, iar rularea directă a fișierelor .ts în Node.js (care doar șterge tipurile) nu o acceptă. În aceste proiecte declari câmpurile explicit.
Exemple
Exemplul 1: Forma scurtă și forma lungă
Cele două clase sunt echivalente.
class ElevLung {
readonly nume: string;
private nota: number;
constructor(nume: string, nota: number) {
this.nume = nume;
this.nota = nota;
}
rezultat() {
return `${this.nume}: ${this.nota}`;
}
}
class ElevScurt {
constructor(readonly nume: string, private nota: number) {}
rezultat() {
return `${this.nume}: ${this.nota}`;
}
}
console.log(new ElevLung("Ana", 9).rezultat());
console.log(new ElevScurt("Mihai", 8).rezultat());
console.log(new ElevScurt("Ioana", 10));
Rezultat
Ana: 9
Mihai: 8
ElevScurt { nume: 'Ioana', nota: 10 }
Exemplul 2: Amestec de parametri și cod în constructor
pretFaraTva este doar parametru (nu devine câmp); nume și cota devin câmpuri.
class Produs {
readonly pret: number;
constructor(public nume: string, pretFaraTva: number, private cota = 0.21) {
this.pret = Math.round(pretFaraTva * (1 + this.cota) * 100) / 100;
}
}
const p = new Produs("Ghiozdan", 120);
console.log(p);
console.log(Object.keys(p));
Rezultat
Produs { nume: 'Ghiozdan', cota: 0.21, pret: 145.2 }
[ 'nume', 'cota', 'pret' ]
Greșeli frecvente
- Uiți modificatorul și scrii
constructor(nume: string) {}, apoi foloseștithis.nume. Fără modificator nu se creează câmp: tsc dă Property ‘nume’ does not exist. - Folosești parameter properties într-un proiect cu
erasableSyntaxOnly. Declară câmpurile normal.
Comenzi înrudite
class: Clasele din JavaScript, cu tipuri pe câmpuri, constructor și metode, plus modificatori de acces și interfețe.public, private, protected: Modificatorii de acces spun cine poate folosi un câmp sau o metodă: oricine, doar clasa sau și clasele derivate.readonly: Marchează o proprietate care primește valoare o singură dată și nu mai poate fi modificată după aceea.extends: O clasă moștenește câmpurile și metodele altei clase; o interfață preia proprietățile altor interfețe.