noImplicitThis în TypeScript

Dă eroare când this este folosit într-o funcție unde tipul lui nu se știe (ar fi any).

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

tsc --noImplicitThis

Ce face noImplicitThis

În JavaScript, this depinde de felul în care este apelată funcția. Într-o funcție obișnuită (function () {}) scrisă în interiorul unei metode, this nu mai este obiectul metodei. TypeScript nu poate ști ce este, așa că this ar fi any. Cu noImplicitThis, folosirea lui devine eroarea TS2683.

Rezolvări: o funcție săgeată (() => {}), care păstrează this din exterior, sau un parametru this cu tip: function afiseaza(this: Persoana). Parametrul this există doar în tipuri și dispare din JavaScript-ul generat.

Implicit este false, dar devine true când strict este true.

Parametri

Parametru Descriere
true Activează verificarea.
false Dezactivează verificarea, chiar dacă "strict": true.
(lipsă) Ia valoarea lui strict: activă dacă strict este true, altfel inactivă.

Exemple

Exemplul 1: this într-o funcție obișnuită

Funcția întoarsă de creste și funcția afiseaza folosesc this fără ca tipul lui să fie cunoscut.

// tsconfig.json
{
  "compilerOptions": {
    "noImplicitThis": true
  }
}

// index.ts
const contor = {
  valoare: 0,
  creste() {
    return function () {
      this.valoare++;
    };
  },
};
console.log(contor);

function afiseaza() {
  console.log(this.nume);
}
afiseaza();

Rezultat (tsc 5.9)

$ npx tsc --noEmit
index.ts(5,7): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
index.ts(12,15): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.

Exemplul 2: Funcție săgeată și parametru this

Săgeata păstrează this al obiectului contor. Funcția afiseaza declară tipul lui this și este apelată cu call.

const contor = {
  valoare: 0,
  creste() {
    return () => {
      this.valoare++;
    };
  },
};
const plus = contor.creste();
plus();
plus();
console.log("valoare:", contor.valoare);

interface Persoana { nume: string }
function afiseaza(this: Persoana): void {
  console.log("Nume:", this.nume);
}
afiseaza.call({ nume: "Ana" });

Rezultat

valoare: 2
Nume: Ana

Greșeli frecvente

  • Să scrii this: any ca să scapi de eroare. Pune tipul real al obiectului.
  • Să transmiți o metodă de clasă ca callback (buton.onclick = obj.metoda) și să te aștepți să păstreze this. Folosește o săgeată sau bind.

Comenzi înrudite

  • strict: Pornește dintr-o singură mișcare toate verificările stricte de tipuri (strictNullChecks, noImplicitAny și celelalte).
  • noImplicitAny: Dă eroare când TypeScript nu poate deduce un tip și ar folosi în tăcere any (de obicei la parametrii fără tip).
  • strictBindCallApply: Verifică argumentele trimise prin bind, call și apply după tipurile funcției originale.