2017-05-03 7 views

答えて

2

viewsDictionaryタイプ{ [key: string]: Object }を明示的に指定しています。互換性のある値を代入してもその型は変わらないので、とkeyofのどの文字列でもtypeof viewsDictionaryが残っています。

あなたは

viewsDictionary = { category: {} }; 

を割り当てることによってだけでなく正常に動作されていることを確認することができます。

TSは、型自体を推測し、期待どおりに動作しますので、ジャスト、明示的な型宣言を削除します。

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

let result: ViewName; 

result = "category"; error 

は今「『ABC』を」というタイプ「『カテゴリーは』」型に代入できません不平を言います。

更新:

ます。また、(コメントから)明示的に型を指定することができます

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

let result: ViewName; 

result = "def"; // still error 

[タイプ'{ abc: {}; def: {}; }''{ abc: {}; }'を型に代入ないことをviewsDictionaryに別のキーを追加したときにこれは文句を言うでしょう

+0

私は多くのことを考えました。このための専門用語は型の拡大です。しかし、あなたが言うようにすれば、問題はviewsDictionary自体がどのような型の値も持つことができるということです。私は、viewsDictionaryの値がすべて特定の型であることを保証し、そのキーの型を作成したいと思います。 – prmph

+0

答えを更新しました... –

関連する問題