Ce face noImplicitAny
Când TypeScript nu știe tipul unei valori și nici nu îl poate deduce, folosește any: un tip care acceptă orice și oprește verificarea. Cu noImplicitAny, acest any „implicit” devine eroare. Cel mai des apare la parametrii de funcții fără tip: function salut(nume).
Opțiunea nu interzice any scris de tine (let x: any); interzice doar any pus automat. Apare și la indexarea unui obiect cu o cheie de tip string (eroarea TS7053) și la importul unui pachet JavaScript fără declarații de tip.
Implicit este false, dar devine true când strict este true. Este de obicei prima opțiune strictă pornită într-un proiect migrat din JavaScript.
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: Parametru fără tip
Parametrul nume nu are tip, deci ar fi any. Tabloul gol note nu dă eroare: TypeScript îi urmărește tipul din push.
// tsconfig.json
{
"compilerOptions": {
"noImplicitAny": true
}
}
// index.ts
function salut(nume) {
return "Salut, " + nume;
}
const note = [];
note.push(9);
console.log(salut("Ana"), note);
Rezultat (tsc 5.9)
$ npx tsc --noEmit
index.ts(1,16): error TS7006: Parameter 'nume' implicitly has an 'any' type.
Exemplul 2: Indexare cu o cheie oarecare
Obiectul are doar cheile paine și lapte. Indexat cu un string oarecare, rezultatul ar fi any, așa că apare eroarea TS7053.
// tsconfig.json
{
"compilerOptions": {
"noImplicitAny": true
}
}
// index.ts
const preturi = { paine: 5, lapte: 8 };
const produs: string = "paine";
console.log(preturi[produs]);
Rezultat (tsc 5.9)
$ npx tsc --noEmit
index.ts(3,13): error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ paine: number; lapte: number; }'.
No index signature with a parameter of type 'string' was found on type '{ paine: number; lapte: number; }'.
Exemplul 3: Codul corectat
Parametrul primește tipul string, iar cheia este restrânsă la cheile reale ale obiectului cu keyof typeof.
function salut(nume: string): string {
return "Salut, " + nume;
}
const preturi = { paine: 5, lapte: 8 };
type NumeProdus = keyof typeof preturi;
const produs: NumeProdus = "paine";
console.log(salut("Ana"));
console.log(`${produs}: ${preturi[produs]} lei`);
Rezultat
Salut, Ana
paine: 5 lei
Greșeli frecvente
- Să repari eroarea scriind
: anypeste tot. Eroarea dispare, dar pierzi verificarea; pune tipul real sauunknown. - Să crezi că
noImplicitAnyverifică șianyvenit din biblioteci (de exemplu rezultatul luiJSON.parse). Acela esteanyexplicit și trece.
Comenzi înrudite
strict: Pornește dintr-o singură mișcare toate verificările stricte de tipuri (strictNullChecks, noImplicitAny și celelalte).noImplicitThis: Dă eroare când this este folosit într-o funcție unde tipul lui nu se știe (ar fi any).useUnknownInCatchVariables: Variabila din catch (e) primește tipul unknown în loc de any, deci trebuie verificată înainte de folosire.checkJs: Raportează erorile de tip și în fișierele .js, folosind tipurile deduse și comentariile JSDoc.