override în TypeScript

Clase TypeScript 4.3

Marchează o metodă care rescrie o metodă din clasa de bază; tsc dă eroare dacă metoda de bază nu există.

Sintaxă
class Copil extends Parinte {
    override metoda(): Tip { ... }
}

Ce face override

Când o clasă derivată rescrie o metodă a părintelui, poți pune override în față. Cuvântul cere compilatorului să verifice că părintele chiar are o metodă cu acel nume. Dacă greșești numele sau dacă metoda din părinte este redenumită sau ștearsă mai târziu, primești eroare, în loc ca metoda ta să devină în tăcere o metodă nouă, niciodată apelată.

Opțiunea de compilare noImplicitOverride face cuvântul obligatoriu: orice metodă care rescrie una din părinte fără override este eroare. Așa, citind clasa, vezi imediat ce metode vin din părinte.

override se poate pune pe metode, câmpuri și accesori și se combină cu alți modificatori: public override, protected override, override readonly.

Exemple

Exemplul 1: Rescriere corectă

class Notificare {
    text(destinatar: string): string {
        return `Salut, ${destinatar}!`;
    }
}

class NotificareFormala extends Notificare {
    override text(destinatar: string): string {
        return `Stimată doamnă / Stimate domn ${destinatar},`;
    }
}

const lista: Notificare[] = [new Notificare(), new NotificareFormala()];
for (const n of lista) console.log(n.text("Popescu"));

Rezultat

Salut, Popescu!
Stimată doamnă / Stimate domn Popescu,

Exemplul 2: Nume greșit prins de override

Metoda părintelui se numește text, nu texte.

class Notificare {
    text(): string {
        return "Salut!";
    }
}
class NotificareFormala extends Notificare {
    override texte(): string {
        return "Stimate domn,";
    }
}
console.log(new NotificareFormala().text());

Eroarea afișată de tsc

exemplu.mts(7,14): error TS4117: This member cannot have an 'override' modifier because it is not declared in the base class 'Notificare'. Did you mean 'text'?

Exemplul 3: Cu noImplicitOverride, cuvântul devine obligatoriu

Fragment din tsconfig.json și eroarea dată pentru o metodă rescrisă fără override.

// tsconfig.json: { "compilerOptions": { "noImplicitOverride": true } }
class Baza {
    salut(): string { return "Salut"; }
}
class Derivata extends Baza {
    salut(): string { return "Bună ziua"; }
}

Eroarea afișată de tsc

exemplu.mts(6,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Baza'.

Greșeli frecvente

  • Pui override într-o clasă care nu extinde nimic. tsc dă This member cannot have an ‘override’ modifier because its containing class does not extend another class.
  • Crezi că override schimbă comportamentul la rulare. Doar verifică; codul generat este același.

Comenzi înrudite

  • extends: O clasă moștenește câmpurile și metodele altei clase; o interfață preia proprietățile altor interfețe.
  • abstract: O clasă abstract nu poate fi instanțiată; metodele abstract trebuie implementate în clasele derivate.
  • class: Clasele din JavaScript, cu tipuri pe câmpuri, constructor și metode, plus modificatori de acces și interfețe.
  • implements: O clasă promite că respectă una sau mai multe interfețe; tsc verifică dacă are toți membrii ceruți.