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
Sind Sie sicher, dass Sie "Objekt" mit einem Großbuchstaben "O" meinen? –