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: anyca 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ăstrezethis. Folosește o săgeată saubind.
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.