2014-09-17 13 views
5

Próba dostępu do właściwości dyktowania z notacją kropkową powoduje, że Maszynopis narzeka. Specyfikacja języka, 4.10, stwierdza:maszynopis: właściwość dostępu z notacją kropkową przy użyciu "słownika" typu

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.

Używam:

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

var dict: MapStringToFunction = {}; 

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

dict.say(); 

MapStringToFunction ma podpisu indeksu żądło i say jest typu String, więc powinno być dozwolone? Ale oczywiste nie jest. Jaki jest mój błąd i jak mogę go zmienić na kod, aby móc wpisywać właściwości dyktowania i dostępu z notacją kropkową?

+0

Takie zachowanie mnie dziwi, jak również. Nawet po przeczytaniu odpowiedzi czuję, że powinniśmy móc odwoływać się do właściwości interfejsów z notacją kropkową. – Jopela

Odpowiedz

2

Dla:

the property access is of the type of that index signature

dostępu do obiektu, w tym przypadku, to zapis wspornik:

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

var dict: MapStringToFunction = {}; 

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

dict['say'](); 

Więcej

Poniższa będzie błąd czasu kompilacji:

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

In o ur przypadek, funkcja jest jedynym rodzajem nieruchomość to umożliwia:

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

Jednak, aby móc korzystać z żadnego majątku należy stwierdzić

Inaczej byłoby otworzyć zbyt dużo type-niebezpieczne dostępu. Na przykład jeśli to, co proponują pozwolono dodaje zawiedzie tylko w czasie wykonywania, a nie kompilacji:

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

var dict: MapStringToFunction = {}; 

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

Wydaje mi się, że trudno mi zrozumieć pojęcie wzoru słownika. W przykładzie, o którym wspomniałem, istnieje sposób zdefiniowania interfejsu dla 'dict', który pozwala na sprawdzenie, czy klucz powinien być łańcuchem i wartością Function? Czy jest var dyktat: jakieś najlepsze rozwiązanie tutaj? – donnut

+1

klawisz 'ciąg' jest * zawsze * dozwolony. Podpis indeksu ogranicza jedynie wartość * wartości *. To znaczy, że używam głównie podpisów indeksu do celów dokumentacyjnych, a nie bezpieczeństwa typu. – basarat

Powiązane problemy