constructor parameter properties în TypeScript

Clase TypeScript 1.0

Un modificator pus pe un parametru al constructorului declară câmpul și îl inițializează automat.

Sintaxă
class A {
    constructor(public x: number, private readonly y: string) {}
}

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ști this.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.