accesori get/set în TypeScript

Clase TypeScript 1.0

Proprietăți calculate: get rulează cod la citire, set rulează cod la scriere, dar se folosesc ca un câmp.

Sintaxă
class A {
    get valoare(): Tip { return ...; }
    set valoare(v: Tip) { ... }
}
obiect.valoare;          // apelează get
obiect.valoare = x;      // apelează set

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.x nu 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.