strict în TypeScript

Pornește dintr-o singură mișcare toate verificările stricte de tipuri (strictNullChecks, noImplicitAny și celelalte).

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

tsc --strict

Ce face strict

strict este comutatorul principal al verificărilor stricte. Cu "strict": true, TypeScript activează împreună: noImplicitAny, strictNullChecks, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, strictBuiltinIteratorReturn, noImplicitThis, useUnknownInCatchVariables și alwaysStrict. Fiecare are pagina ei.

Valoarea implicită este false, dar tsc --init scrie "strict": true în fișierul nou, iar pentru proiectele noi este alegerea recomandată. Poți opri o singură verificare din familie, de exemplu "strict": true, "strictNullChecks": false: opțiunea scrisă explicit câștigă.

Atenție: versiunile noi de TypeScript pot adăuga verificări noi în familia strict (așa a apărut strictBuiltinIteratorReturn în 5.6). După o actualizare pot apărea erori noi în cod care înainte trecea. Opțiunile din afara familiei (noUncheckedIndexedAccess, exactOptionalPropertyTypes, noUnusedLocals…) nu sunt pornite de strict.

Parametri

Parametru Descriere
true Activează toate verificările din familia strict (cele care nu sunt setate explicit).
false Valoarea implicită. Fiecare verificare din familie rămâne oprită, dacă nu o pornești separat.

Exemple

Exemplul 1: Același cod, cu și fără strict

Fără strict, codul de mai jos trece de compilare, deși parametrii nu au tip și null este pus într-un string. Cu strict apar trei erori: două de la noImplicitAny și una de la strictNullChecks.

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

// index.ts
function pret(produs, cantitate) {
  return produs.pret * cantitate;
}

const oras: string = null;
console.log(pret({ pret: 12 }, 3), oras);

Rezultat (tsc 5.9)

$ npx tsc --noEmit
index.ts(1,15): error TS7006: Parameter 'produs' implicitly has an 'any' type.
index.ts(1,23): error TS7006: Parameter 'cantitate' implicitly has an 'any' type.
index.ts(5,7): error TS2322: Type 'null' is not assignable to type 'string'.

Exemplul 2: Ce pornește strict, văzut cu –showConfig

tsc --showConfig afișează configurația finală. Se vede că strict a pornit restul familiei, iar strictNullChecks, setat explicit pe false, a rămas oprit.

// tsconfig.json
{
  "compilerOptions": {
    "strict": true,
    "strictNullChecks": false
  }
}

Rezultat (tsc 5.9)

$ npx tsc --showConfig
{
    "compilerOptions": {
        "strict": true,
        "strictNullChecks": false,
        "noImplicitAny": true,
        "noImplicitThis": true,
        "strictFunctionTypes": true,
        "strictBindCallApply": true,
        "strictPropertyInitialization": true,
        "strictBuiltinIteratorReturn": true,
        "alwaysStrict": true,
        "useUnknownInCatchVariables": true
    },
    "files": [
        "./index.ts"
    ]
}

Exemplul 3: Cod scris pentru strict

Exemplele de pe acest site sunt verificate cu --strict. Codul are tipuri pentru parametri și tratează explicit cazul în care un produs nu este găsit.

interface Produs {
  nume: string;
  pret: number;
}

const produse: Produs[] = [
  { nume: "pâine", pret: 5 },
  { nume: "lapte", pret: 8 },
];

function cauta(nume: string): Produs | undefined {
  return produse.find(p => p.nume === nume);
}

for (const nume of ["lapte", "cafea"]) {
  const p = cauta(nume);
  console.log(p ? `${p.nume}: ${p.pret} lei` : `${nume}: nu există`);
}

Rezultat

lapte: 8 lei
cafea: nu există

Greșeli frecvente

  • Să crezi că strict pornește tot. noUncheckedIndexedAccess, exactOptionalPropertyTypes, noImplicitReturns și noUnusedLocals trebuie pornite separat.
  • Să activezi strict într-un proiect mare dintr-odată. Pornește verificările pe rând (de obicei întâi noImplicitAny, apoi strictNullChecks) și repară erorile pas cu pas.
  • Să rulezi tsc fisier.ts și să te aștepți să fie folosit tsconfig.json. Când dai nume de fișiere în linia de comandă, tsc ignoră tsconfig.json și folosește valorile implicite (deci fără strict).

Comenzi înrudite

  • strictNullChecks: Face din null și undefined tipuri separate: o valoare care poate lipsi trebuie verificată înainte de folosire.
  • 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).
  • noUncheckedIndexedAccess: Adaugă undefined la tipul valorilor citite cu index (note[0], stoc[„pere”]), pentru că ele pot lipsi.
  • --showConfig: Afișează configurația finală (cu extends rezolvat și opțiunile deduse) și lista de fișiere, fără să compileze.
  • --init: Creează un fișier tsconfig.json nou, cu setările recomandate de versiunea curentă de TypeScript.