Ce face accesori get/set
Un getter (get) este o metodă fără parametri care se citește ca o proprietate: cerc.arie, fără paranteze. Un setter (set) primește un singur parametru și rulează când atribui proprietatea: temp.celsius = 20. Așa poți calcula valori din alte câmpuri sau valida datele la atribuire.
O proprietate care are doar get este automat readonly: atribuirea este eroare de compilare. Din TypeScript 5.1, tipul acceptat de set poate fi diferit de cel returnat de get (de exemplu setter-ul acceptă și text, getter-ul returnează mereu număr).
Accesorii funcționează și în obiecte literale, nu doar în clase. Cuvântul accessor (de la decoratori) creează automat un getter și un setter pentru un câmp; vezi decoratori.
Exemple
Exemplul 1: Getter calculat și setter cu validare
class Temperatura {
#celsius = 0;
get celsius(): number {
return this.#celsius;
}
set celsius(valoare: number) {
if (valoare < -273.15) throw new RangeError("sub zero absolut");
this.#celsius = valoare;
}
get fahrenheit(): number {
return this.#celsius * 9 / 5 + 32;
}
}
const t = new Temperatura();
t.celsius = 21.5;
console.log(t.celsius, t.fahrenheit);
try {
t.celsius = -300;
} catch (e) {
console.log((e as RangeError).message, t.celsius);
}
Rezultat
21.5 70.7
sub zero absolut 21.5
Exemplul 2: Setter care acceptă alt tip
Setter-ul primește număr sau text, getter-ul returnează mereu număr.
class Nota {
#valoare = 1;
get valoare(): number {
return this.#valoare;
}
set valoare(v: number | string) {
this.#valoare = Math.min(10, Math.max(1, Number(v)));
}
}
const n = new Nota();
n.valoare = "9";
console.log(n.valoare, typeof n.valoare);
n.valoare = 14;
console.log(n.valoare);
Rezultat
9 number
10
Exemplul 3: Proprietate doar cu get
class Cerc {
constructor(private raza: number) {}
get arie() {
return Math.PI * this.raza ** 2;
}
}
const c = new Cerc(2);
c.arie = 10;
console.log(c.arie);
Eroarea afișată de tsc
exemplu.mts(8,3): error TS2540: Cannot assign to 'arie' because it is a read-only property.
Greșeli frecvente
- Apelezi getter-ul cu paranteze:
cerc.arie(). tsc dă This expression is not callable; getter-ul se citește ca o proprietate. - Pui în getter cod lent sau cu efecte (cereri la server, modificări). Cine citește
obiect.xnu se așteaptă la asta; folosește o metodă.
Comenzi înrudite
class: Clasele din JavaScript, cu tipuri pe câmpuri, constructor și metode, plus modificatori de acces și interfețe.#câmpuri private: Câmpurile care încep cu # sunt private și la rulare: nu pot fi citite deloc din afara clasei.readonly: Marchează o proprietate care primește valoare o singură dată și nu mai poate fi modificată după aceea.decoratori: Funcții puse cu @ deasupra claselor, metodelor sau câmpurilor, care le modifică sau le înlocuiesc comportamentul.