Ce face class
O class este un șablon pentru obiecte: descrie ce date are fiecare obiect (câmpurile) și ce poate face (metodele). Creezi obiecte cu new. TypeScript adaugă peste clasele din JavaScript tipuri pentru câmpuri și parametri, modificatori de acces (public, private, protected), readonly, clase abstract și implements.
Câmpurile se declară în corpul clasei, cu tip. În modul strict (strictPropertyInitialization), fiecare câmp trebuie să primească o valoare fie direct la declarare, fie în constructor; altfel tsc dă eroare. Un câmp care primește valoarea mai târziu se marchează cu ? (poate fi undefined) sau, dacă ești sigur, cu !.
Numele unei clase este și un tip: const c: Cont = new Cont(...). Tipul descrie forma obiectului, deci orice obiect cu aceleași câmpuri și metode publice este compatibil, chiar dacă nu a fost creat cu new Cont.
Exemple
Exemplul 1: O clasă simplă
class ContBancar {
titular: string;
sold: number = 0;
constructor(titular: string) {
this.titular = titular;
}
depune(suma: number): void {
this.sold += suma;
}
retrage(suma: number): boolean {
if (suma > this.sold) return false;
this.sold -= suma;
return true;
}
}
const cont = new ContBancar("Ana Popescu");
cont.depune(500);
console.log(cont.retrage(200), cont.retrage(1000));
console.log(`${cont.titular}: ${cont.sold} lei`);
Rezultat
true false
Ana Popescu: 300 lei
Exemplul 2: Câmp fără valoare inițială
În modul strict, câmpul oras trebuie inițializat în constructor sau marcat ca opțional.
class Elev {
nume: string;
oras: string;
constructor(nume: string) {
this.nume = nume;
}
}
console.log(new Elev("Ana"));
Eroarea afișată de tsc
exemplu.mts(3,5): error TS2564: Property 'oras' has no initializer and is not definitely assigned in the constructor.
Exemplul 3: Numele clasei este și un tip
Obiectul literal are aceleași câmpuri ca Punct, deci se potrivește cu tipul, deși nu a fost creat cu new. instanceof verifică însă felul în care a fost creat.
class Punct {
constructor(public x: number, public y: number) {}
}
function distanta(a: Punct, b: Punct): number {
return Math.hypot(a.x - b.x, a.y - b.y);
}
const p = new Punct(0, 0);
const q = { x: 3, y: 4 };
console.log(distanta(p, q));
console.log(p instanceof Punct, q instanceof Punct);
Rezultat
5
true false
Greșeli frecvente
- Uiți
this.în metode și scriisold += suma. tsc dă Cannot find name ‘sold’. - Pui
!pe câmpuri ca să scapi de eroarea de inițializare. Dacă uiți să le dai valoare, aparundefined-uri la rulare.
Comenzi înrudite
public, private, protected: Modificatorii de acces spun cine poate folosi un câmp sau o metodă: oricine, doar clasa sau și clasele derivate.constructor parameter properties: Un modificator pus pe un parametru al constructorului declară câmpul și îl inițializează automat.extends: O clasă moștenește câmpurile și metodele altei clase; o interfață preia proprietățile altor interfețe.implements: O clasă promite că respectă una sau mai multe interfețe; tsc verifică dacă are toți membrii ceruți.abstract: O clasă abstract nu poate fi instanțiată; metodele abstract trebuie implementate în clasele derivate.static: Membrii static aparțin clasei, nu fiecărui obiect: se folosesc cu NumeClasa.membru.