noImplicitAny în TypeScript

Dă eroare când TypeScript nu poate deduce un tip și ar folosi în tăcere any (de obicei la parametrii fără tip).

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

tsc --noImplicitAny

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 : any peste tot. Eroarea dispare, dar pierzi verificarea; pune tipul real sau unknown.
  • Să crezi că noImplicitAny verifică și any venit din biblioteci (de exemplu rezultatul lui JSON.parse). Acela este any explicit ș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.