noImplicitOverride în TypeScript

Obligă scrierea cuvântului override pe metodele din clasele derivate care înlocuiesc o metodă din clasa de bază.

Sintaxă
"compilerOptions": { "noImplicitOverride": true }

tsc --noImplicitOverride

Ce face noImplicitOverride

Cuvântul override spune că o metodă înlocuiește o metodă din clasa de bază. Fără opțiune, este facultativ. Cu noImplicitOverride, o metodă care înlocuiește alta fără override dă eroarea TS4114. Așa vezi imediat ce metode depind de clasa părinte.

Indiferent de opțiune, override pus pe o metodă care nu există în clasa de bază dă eroarea TS4113. Asta prinde metodele redenumite sau șterse din părinte.

Implicit este false și nu face parte din strict.

Parametri

Parametru Descriere
true Metodele care înlocuiesc o metodă din clasa de bază trebuie să aibă override.
false Valoarea implicită. override este facultativ.

Exemple

Exemplul 1: override lipsă și override greșit

Carte.descriere nu are override (TS4114). Revista.pret are override, dar Produs nu are pret (TS4113, apare și fără opțiune).

// tsconfig.json
{
  "compilerOptions": {
    "noImplicitOverride": true,
    "target": "es2022"
  }
}

// index.ts
class Produs {
  descriere() { return "produs"; }
}

class Carte extends Produs {
  descriere() { return "carte"; }
}

class Revista extends Produs {
  override descriere() { return "revistă"; }
  override pret() { return 10; }
}
console.log(new Carte().descriere(), new Revista().descriere());

Rezultat (tsc 5.9)

$ npx tsc --noEmit
index.ts(6,3): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Produs'.
index.ts(11,12): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Produs'.

Exemplul 2: Clase corecte

Metoda înlocuită are override; metoda nouă nu are.

class Produs {
  constructor(public nume: string) {}
  descriere(): string { return `produs: ${this.nume}`; }
}

class Carte extends Produs {
  constructor(nume: string, public autor: string) { super(nume); }
  override descriere(): string { return `carte: ${this.nume} de ${this.autor}`; }
  pagini(): number { return 320; }
}

const c = new Carte("Amintiri din copilărie", "Ion Creangă");
console.log(c.descriere(), c.pagini());

Rezultat

carte: Amintiri din copilărie de Ion Creangă 320

Greșeli frecvente

  • Să crezi că override schimbă comportamentul la rulare. Este doar o verificare și dispare din JavaScript-ul generat.

Comenzi înrudite

  • strictPropertyInitialization: Dă eroare pentru proprietățile de clasă declarate, dar care nu primesc valoare nici la declarare, nici în constructor.
  • useDefineForClassFields: Câmpurile de clasă se comportă ca în standardul JavaScript (definite cu Object.defineProperty), nu ca atribuiri în constructor.