typescript - Čo znamená 'Indexový podpis typu objektu má implicitne typ 'any''.


Mám nasledujúci kód a noImplicitAny:true v tsconfig:

let o = {a: 3};

// works fine
o['a'] = 3;

// reports an error 
// Error:(4, 1) TS7017:Index signature of object type implicitly has an 'any' type.
o['b'] = 3;

Čo znamená táto chyba?

Tu je to na TypeScript playground - nezabudnite kliknúť na Možnosti a nastaviť noImplicitAny (zdá sa, že si možnosti v zdieľateľných odkazoch nepamätá).

Odpoveď č. 1

Chyba je spôsobená tým, že indexový podpis nie je explicitne definovaný.

Môžete explicitne deklarovať indexový podpis takto:

let ox : { [index:string] : number } = {};
ox['b'] = 3; 

Dôvod, prečo o['a']=3; nespôsobuje chybu, je pravidlo 1 pri prístupe k vlastnostiam pomocou hranatých zátvoriek, ktoré je definované v nasledujúcich pravidlách zo špecifikácie:

  1. Ak je index reťazcový literál alebo číselný literál a objekt má očividnú vlastnosť (odsek 3.11.1) s názvom daným týmto literálom (v prípade číselného literálu prevedeného na jeho reťazcovú reprezentáciu), prístup k vlastnosti je typu tejto vlastnosti.
  2. Inak, ak objekt má zjavný číselný indexový podpis a index je typu Any, primitívny typ Number alebo typ enum, prístup k vlastnosti je typu toho indexového podpisu.
  3. Inak, ak objekt má zjavný podpis reťazcového indexu a index je typu Any, String alebo Number primitívneho typu, alebo typu enum, prístup k vlastnosti je typu toho podpisu indexu.
  4. Inak, ak je index typu Any, primitívneho typu String alebo Number, alebo typu enum, prístup k vlastnosti je typu Any.
  5. Inak je prístup k vlastnosti neplatný a dôjde k chybe počas kompilácie.

Súvisiace články