2014-09-17 12 views
5

Nokta notasyonu ile bir dict özelliğine erişmeye çalışmak, Türleri şikayet eder. dil belirtimi, 4.10, devletler:typescript: 'dictionary' türünde nokta notasyonu ile erişim özelliği

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

var dict: MapStringToFunction = {}; 

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

dict.say(); 

MapStringToFunction bir acı endeksi imzası vardır ve say String türünün, bu nedenle izin verilmelidir:

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.

kullanıyorum? Ama belli değil. Hatam nedir ve kodu nasıl değiştirebilirim, böylece nokta notasyonu ile dict yazabilir ve özelliklerine erişebilirim?

+0

. Cevabı okuduktan sonra bile, nokta gösterimi ile arayüzlerin özelliklerine referans verebilmemiz gerektiğini hissediyorum. – Jopela

cevap

2

için:

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

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

var dict: MapStringToFunction = {}; 

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

dict['say'](); 

Daha

şu bir derleme zamanı hatası olacaktır: Bu durumda

the property access is of the type of that index signature

Mülkiyet erişimi braket nottur

o içinde ur durumda, Fonksiyon sadece mülkiyet türü verir geçerli:

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

Ancak Aksi takdirde çok fazla tip güvensiz erişime açacağını

beyan edilmelidir herhangi özelliğini kullanmak mümkün. Eğer izin verildi önerim Örneğin için aşağıdaki sadece çalışma zamanında başarısız ve saati derlemek olmaz ise: Bu davranış beni de şaşırtan

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

var dict: MapStringToFunction = {}; 

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

Sözlük kalıbı kavramını anlamakta zorlanıyorum. Bahsettiğim örnekte, "dict" için bir anahtarın tanımlanmasının bir yolu vardır, bu anahtarın String olması ve Function değeri mi olduğunu kontrol etmeyi sağlar. Veya var dict: Burada en iyi çözüm? – donnut

+1

tuşu "string" * her zaman * izin verilir. Dizin imzası sadece * değerinin * ne olabileceğini sınırlar. Bu yazımda, çoğu zaman, tür güvenliği için değil, belgeleme amacıyla dizin imzaları kullanıyorum. – basarat

İlgili konular