noUncheckedIndexedAccess în TypeScript

Adaugă undefined la tipul valorilor citite cu index (note[0], stoc["pere"]), pentru că ele pot lipsi.

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

tsc --noUncheckedIndexedAccess

Ce face noUncheckedIndexedAccess

Implicit, TypeScript presupune că note[0] dintr-un number[] este mereu un number, chiar dacă tabloul poate fi gol. La fel pentru obiectele cu chei oarecare (Record<string, number>): orice cheie pare să existe. Cu noUncheckedIndexedAccess, tipul devine number | undefined, deci trebuie să verifici înainte de folosire.

Proprietățile cunoscute (obj.nume) și buclele for...of nu sunt afectate: acolo valoarea există sigur. Tuplurile cu lungime fixă ([number, string]) nu primesc undefined la pozițiile lor.

Implicit este false și nu face parte din strict. tsc --init din 5.9 o pornește în fișierul nou.

Parametri

Parametru Descriere
true Citirile prin index primesc | undefined.
false Valoarea implicită.

Exemple

Exemplul 1: Citiri prin index

note[0] și stoc["pere"] pot fi undefined. Bucla for...of nu dă eroare.

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

// index.ts
const note: number[] = [9, 7, 10];
const prima = note[0];
console.log(prima.toFixed(1));

const stoc: Record<string, number> = { mere: 12 };
console.log(stoc["pere"] + 1);

for (const n of note) console.log(n.toFixed(1));

Rezultat (tsc 5.9)

$ npx tsc --noEmit
index.ts(3,13): error TS18048: 'prima' is possibly 'undefined'.
index.ts(6,13): error TS2532: Object is possibly 'undefined'.

Exemplul 2: Cod care tratează lipsa

La rulare, stoc["pere"] chiar este undefined, iar [][0] la fel. Codul de mai jos funcționează corect și cu opțiunea pornită.

const note: number[] = [];
const prima = note[0];
console.log("prima notă:", prima !== undefined ? prima.toFixed(1) : "nu există");

const stoc: Record<string, number> = { mere: 12 };
for (const fruct of ["mere", "pere"]) {
  const bucati = stoc[fruct];
  console.log(fruct, bucati === undefined ? "nu avem" : bucati + 1);
}

Rezultat

prima notă: nu există
mere 13
pere nu avem

Greșeli frecvente

  • Să o pornești și să adaugi ! la fiecare index. Verifică o dată și folosește variabila restrânsă.
  • Să crezi că bucla clasică for (let i = 0; i < a.length; i++) scapă de verificare. a[i] este tot T | undefined; folosește for...of sau entries().

Comenzi înrudite

  • strictNullChecks: Face din null și undefined tipuri separate: o valoare care poate lipsi trebuie verificată înainte de folosire.
  • noPropertyAccessFromIndexSignature: Cheile care vin dintr-o semnătură de index ([cheie: string]) se citesc doar cu paranteze: s[„tema”], nu s.tema.
  • exactOptionalPropertyTypes: O proprietate opțională (telefon?: string) poate lipsi, dar nu poate primi explicit valoarea undefined.