2014-09-17 14 views
5

Provare ad accedere a una proprietà di dict con notazione dot rende Typescript lamentarsi. La specifica del linguaggio, 4.10, afferma:dattiloscritto: accesso proprietà con notazione punto utilizzando 'dizionario' tipo

ObjExpr [ IndexExpr]

... if ObjExpr ’s apparent type has a string index signature and IndexExpr is of type Any, the String or Number primitive type, or an enum type, the property access is of the type of that index signature.

sto usando:

interface MapStringToFunction { 
    [index: string]: Function; 
} 

var dict: MapStringToFunction = {}; 

dict.say =() => 'hi'; 

dict.say(); 

MapStringToFunction ha una firma indice di Sting e say è di tipo String, quindi dovrebbe essere permesso? Ma ovvio non lo è. Qual è il mio errore e come posso modificare il codice in modo da poter digitare dict e accedere alle proprietà con la notazione dei punti?

+0

Questo comportamento mi sorprende pure. Anche dopo aver letto la risposta, penso che dovremmo essere in grado di fare riferimento alla proprietà delle interfacce con la notazione dot. – Jopela

risposta

2

Per:

the property access is of the type of that index signature

accesso proprietà in questo caso è la notazione staffa:

interface MapStringToFunction { 
    [index: string]: Function; 
} 

var dict: MapStringToFunction = {}; 

dict['say'] =() => 'hi'; 

dict['say'](); 

Più

Di seguito sarà un errore di compilazione:

interface MapStringToFunction { 
    [index: string]: Function; 
    say: number; // Eroor 
} 

In o ur caso, la funzione è l'unico tipo di proprietà che è permette:

interface MapStringToFunction { 
    [index: string]: Function; 
    say: Function; 
} 

Tuttavia, per essere in grado di utilizzare qualsiasi proprietà che deve essere dichiarato

Altrimenti sarebbe aprire troppo tipo non sicuro accesso. Per esempio se ciò che si propone è stato permesso il seguente sarebbe solo non in fase di esecuzione e non tempo di compilazione:

interface MapStringToFunction { 
    [index: string]: Function; 
} 

var dict: MapStringToFunction = {}; 

dict.say() // Runtime error, as undefined is not callable 
+0

Mi sembra difficile capire il concetto del modello di dizionario. Nell'esempio che ho citato, c'è un modo per definire un'interfaccia per 'dict' che consente di verificare che la chiave debba essere String e il valore Function? O è var dict: qual è la soluzione migliore qui? – donnut

+1

la chiave 'stringa' è * sempre * consentita. La firma dell'indice limita solo ciò che il * valore * può essere. Detto questo, io uso principalmente le firme dell'indice a scopo di documentazione, non di sicurezza del tipo. – basarat

Problemi correlati