2014-09-17 4 views
5

Der Versuch, auf eine Eigenschaft von dict mit Punktnotation zuzugreifen, macht Typoskript zu beanstanden. Die Sprachspezifikation, 4,10, heißt es:Typoskript: Zugriffseigenschaft mit Punktnotation unter Verwendung des "Wörterbuch" -Typs

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.

Ich verwende:

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

var dict: MapStringToFunction = {}; 

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

dict.say(); 

MapStringToFunction einen Stachel Index Signatur hat und say ist vom Typ String, so sollte es erlaubt sein? Aber es ist offensichtlich nicht. Was ist mein Fehler und wie kann ich Code ändern, damit ich dict eingeben und Eigenschaften mit Punktnotation aufrufen kann?

+0

Dieses Verhalten auch mich überrascht. Auch nach dem Lesen der Antwort sollten wir in der Lage sein, Eigenschaften von Schnittstellen mit der Punktnotation zu referenzieren. – Jopela

Antwort

2

Für:

the property access is of the type of that index signature

Zugang zur Immobilie in diesem Fall ist die Klammer-Notation:

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

var dict: MapStringToFunction = {}; 

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

dict['say'](); 

Mehr

Im Folgenden wird eine Kompilierung Fehler sein:

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

In o. ur Fall ist Funktion die einzige Eigenschaft Typ, der erlaubt ist:

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

Allerdings muss

deklariert werden es jede Eigenschaft verwenden, um der Lage sein,

Sonst wäre es zu viel typ unsicheren Zugang zu eröffnen. Zum Beispiel wenn das, was Sie folgendes würde durfte vorschlagen erst zur Laufzeit fehlschlagen und nicht kompilieren Zeit:

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

var dict: MapStringToFunction = {}; 

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

Es scheint mir schwer zu sein, das Konzept des Wörterbuchmusters zu verstehen. In dem Beispiel, das ich erwähnte, gibt es dort eine Möglichkeit, eine Schnittstelle für 'dict' zu definieren, die es ermöglicht, zu überprüfen, ob der Schlüssel String und der Wert Function? Oder ist var dict: die beste Lösung hier? – donnut

+1

Schlüssel 'string' ist * immer * erlaubt. Die Index-Signatur beschränkt nur den * Wert *. Das heißt, ich verwende meist Index-Signaturen für Dokumentationszwecke, nicht Typ-Sicherheit. – basarat

Verwandte Themen