noPropertyAccessFromIndexSignature în TypeScript

Cheile care vin dintr-o semnătură de index ([cheie: string]) se citesc doar cu paranteze: s["tema"], nu s.tema.

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

tsc --noPropertyAccessFromIndexSignature

Ce face noPropertyAccessFromIndexSignature

Un tip cu semnătură de index ([cheie: string]: string) permite orice cheie. Fără opțiune, poți scrie s.tema ca și cum tema ar fi o proprietate declarată. Cu noPropertyAccessFromIndexSignature, cheile nedeclarate se citesc doar cu s["tema"], iar s.tema dă eroarea TS4111.

Astfel, din cod se vede diferența: punctul înseamnă „proprietate care există sigur”, parantezele înseamnă „cheie care poate lipsi”. Proprietățile declarate (limba) se citesc în continuare cu punct.

Implicit este false și nu face parte din strict. Se combină bine cu noUncheckedIndexedAccess.

Parametri

Parametru Descriere
true Cheile din semnătura de index se citesc doar cu ["cheie"].
false Valoarea implicită.

Exemple

Exemplul 1: Acces cu punct la o cheie nedeclarată

s.limba este permis (proprietate declarată), s.tema nu, s["tema"] da.

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

// index.ts
interface Setari {
  limba: string;
  [cheie: string]: string;
}

const s: Setari = { limba: "ro", tema: "întunecată" };
console.log(s.limba);
console.log(s.tema);
console.log(s["tema"]);

Rezultat (tsc 5.9)

$ npx tsc --noEmit
index.ts(8,15): error TS4111: Property 'tema' comes from an index signature, so it must be accessed with ['tema'].

Exemplul 2: Citirea corectă

Proprietatea declarată se citește cu punct, restul cu paranteze și cu o valoare de rezervă.

interface Setari {
  limba: string;
  [cheie: string]: string;
}

const s: Setari = { limba: "ro", tema: "întunecată" };
console.log("limba:", s.limba);
console.log("tema:", s["tema"]);
console.log("font:", s["font"] ?? "implicit");

Rezultat

limba: ro
tema: întunecată
font: implicit

Greșeli frecvente

  • Să crezi că parantezele fac codul mai sigur la rulare. Fac doar diferența vizibilă; pentru verificarea lui undefined folosește noUncheckedIndexedAccess.

Comenzi înrudite

  • noUncheckedIndexedAccess: Adaugă undefined la tipul valorilor citite cu index (note[0], stoc[„pere”]), pentru că ele pot lipsi.
  • 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).