我有这个非常简单的代码:
let viewsDictionary: { [key: string]: Object } = {
abc: {}
};
type ViewName = keyof typeof viewsDictionary;
let result: ViewName;
result = "category";
TypeScript版本2.2.2并不抱怨结果只能具有值“abc”。为什么呢?
答案 0 :(得分:2)
您明确指定viewsDictionary
类型{ [key: string]: Object }
。您指定兼容值的事实不会更改其类型,因此typeof viewsDictionary
保留{ [key: string]: Object }
和keyof
是任何字符串。
您可以通过分配
来验证viewsDictionary = { category: {} };
也可以。
只需删除显式类型声明,因此TS会推断出类型本身,它将按预期工作:
let viewsDictionary = {
abc: {}
};
type ViewName = keyof typeof viewsDictionary;
let result: ViewName;
result = "category"; error
现在抱怨Type'“category”'不能分配给'“abc”'。
<强>更新强>
您还可以明确指定类型(来自评论):
let viewsDictionary: {abc: {}} = {
abc: {},
def: {}, // error
};
type ViewName = keyof typeof viewsDictionary;
let result: ViewName;
result = "def"; // still error
当您向viewsDictionary添加另一个键时,如果类型'{ abc: {}; def: {}; }'
无法分配给'{ abc: {}; }'