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
undefinedfoloseștenoUncheckedIndexedAccess.
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).