打字稿不强制执行类型

时间:2017-05-03 03:38:58

标签: javascript typescript2.0 typechecking

我有这个非常简单的代码:

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

let result: ViewName;

result = "category";

TypeScript版本2.2.2并不抱怨结果只能具有值“abc”。为什么呢?

1 个答案:

答案 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: {}; }'

,则会抱怨