static în TypeScript

Clase TypeScript 1.0

Membrii static aparțin clasei, nu fiecărui obiect: se folosesc cu NumeClasa.membru.

Sintaxă
class A {
    static numar = 0;
    static creeaza(): A { ... }
    static { /* bloc de inițializare */ }
}
A.numar; A.creeaza();

Ce face static

Un câmp sau o metodă static există o singură dată, pe clasă, nu în fiecare obiect creat cu new. Îl folosești prin numele clasei: Elev.numar, Data.azi(). Este potrivit pentru contoare comune, constante ale clasei și metode „fabrică” care creează obiecte.

În interiorul unei metode statice, this este clasa însăși, nu un obiect. O metodă statică nu poate folosi câmpurile obișnuite (de instanță) fără un obiect. Membrii statici se pot combina cu private, readonly și #.

Un bloc static, static { ... }, rulează o singură dată, când este definită clasa, și poate pregăti câmpurile statice cu cod mai complex. Parametrii generici ai clasei nu pot fi folosiți în membrii statici.

Exemple

Exemplul 1: Contor comun și metodă fabrică

class Elev {
    static numar = 0;
    static readonly SCOALA = "Colegiul Național Iași";

    readonly id: number;
    private constructor(public nume: string) {
        Elev.numar++;
        this.id = Elev.numar;
    }

    static inscrie(nume: string): Elev {
        return new Elev(nume.trim());
    }
}

const a = Elev.inscrie(" Ana ");
const b = Elev.inscrie("Mihai");
console.log(a.id, a.nume, b.id, b.nume);
console.log(`${Elev.numar} elevi la ${Elev.SCOALA}`);

Rezultat

1 Ana 2 Mihai
2 elevi la Colegiul Național Iași

Exemplul 2: Bloc static

Blocul rulează o dată, la definirea clasei, și construiește tabelul de conversie.

class Valuta {
    static readonly cursuri = new Map<string, number>();
    static {
        const date: [string, number][] = [["EUR", 4.97], ["USD", 4.58], ["GBP", 5.83]];
        for (const [cod, curs] of date) Valuta.cursuri.set(cod, curs);
    }
    static inLei(suma: number, cod: string): number {
        return Math.round(suma * (Valuta.cursuri.get(cod) ?? NaN) * 100) / 100;
    }
}

console.log(Valuta.inLei(100, "EUR"), Valuta.inLei(20, "USD"), Valuta.inLei(5, "CHF"));

Rezultat

497 91.6 NaN

Exemplul 3: Membru static folosit pe obiect

class Elev {
    static numar = 0;
}
const e = new Elev();
console.log(e.numar);

Eroarea afișată de tsc

exemplu.mts(5,15): error TS2576: Property 'numar' does not exist on type 'Elev'. Did you mean to access the static member 'Elev.numar' instead?

Greșeli frecvente

  • Folosești this.numar pentru un câmp static într-o metodă obișnuită. this este obiectul; scrie Elev.numar.
  • Pui stare care ar trebui să fie a fiecărui obiect într-un câmp static. Toate obiectele o împart și se suprascriu unele pe altele.

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.
  • public, private, protected: Modificatorii de acces spun cine poate folosi un câmp sau o metodă: oricine, doar clasa sau și clasele derivate.