2017-05-03 1 views
1

Ich habe diesen sehr einfachen Code:Typoskript nicht erzwingen Typen

let viewsDictionary: { [key: string]: Object } = { 
    abc: {} 
}; 
type ViewName = keyof typeof viewsDictionary; 

let result: ViewName; 

result = "category"; 

Typoskript Version 2.2.2 nicht dieses Ergebnis beschweren nur den Wert „abc“ haben kann. Warum?

+0

Sind Sie sicher, dass Sie "Objekt" mit einem Großbuchstaben "O" meinen? –

Antwort

2

Sie geben explizit viewsDictionary Typ { [key: string]: Object }. Die Tatsache, dass Sie einen kompatiblen Wert zuweisen, ändert seinen Typ nicht und daher sind typeof viewsDictionary bleibt { [key: string]: Object } und keyof sind beliebige Zeichenfolge.

Sie können das überprüfen, indem

viewsDictionary = { category: {} }; 

zuweisen, die fein wie gut funktioniert.

einfach die explizite Typdeklaration entfernen, so TS den Typ selbst folgert und es wird funktionieren wie erwartet:

let viewsDictionary = { 
    abc: {} 
}; 
type ViewName = keyof typeof viewsDictionary; 

let result: ViewName; 

result = "category"; error 

jetzt beklagt, dass Typ ‚‚Kategorie‘‘ ist nicht übertragbar ‚‚abc‘‘ eingeben .

Update:

Sie auch den Typ explizit (von Kommentaren) angeben:

let viewsDictionary: {abc: {}} = { 
    abc: {}, 
    def: {}, // error 
}; 
type ViewName = keyof typeof viewsDictionary; 

let result: ViewName; 

result = "def"; // still error 

Dies wird sich beschweren, wenn Sie einen anderen Schlüssel hinzufügen, dass Typ viewsDictionary '{ abc: {}; def: {}; }' nicht belegbar ist '{ abc: {}; }' eingeben

+0

Ich dachte so viel; der Fachbegriff dafür ist Typerweiterung. Aber wenn ich das tue, was Sie sagen, ist das Problem, dass viewsDictionary selbst Werte beliebigen Typs haben kann. Ich will sicherstellen, dass die Werte von viewsDictionary alle von einem bestimmten Typ sind, und auch einen Typ von seinen Schlüsseln erstellen. – prmph

+0

aktualisiert die Antwort ... –

Verwandte Themen