为什么obj ['NonExistentKey']不会在TS中引发错误?

时间:2019-04-05 16:53:39

标签: typescript

采用以下代码段,我希望第二行出现错误,但是没有一个。

const foo = { someKey: 'foo' };
foo['NonExistentKey'].bar.baz // no errors
foo.NonExistentKey.bar.baz    // NonExistentKey doesn't exist

ts playground link

有什么办法可以捕捉到这个吗?

2 个答案:

答案 0 :(得分:4)

为了简化从JS到TS的过渡,人们认为对对象的动态访问(即,使用[]的访问)不应出错,而只能返回任何内容。

这当然是类型系统中的一个大漏洞,并且有一个编译器标记可以将其关闭,该标记称为noImplicitAny。这将使您的代码引发错误成为预期的错误(但是也会使编译器将any假定为错误的任何地方)。

在操场上,您可以转到选项并启用此选项,您将看到预期的错误。

答案 1 :(得分:2)

捕获此类错误的最简单方法是启用TypeScript的strict模式,或打开noImplicitAny文件中的tsconfig.json标志。

一旦其中一个启用,您将收到如下错误:

wat.ts:2:1 - error TS7017: Element implicitly has an 'any' type because type '{ someKey: string; }' has no index signature.
foo['NonExistentKey'].bar.baz

没有这些标志,foo的隐式输入方式类似于const foo: { [index: string]: any, someKey: string }。我相信这样做的理由是,来自JavaScript的人们经常会任意索引到任意对象并期望它们能正常工作,因此在非严格模式下,即使不是特别安全的类型,也允许这样做。

通常,我发现非严格的行为会造成混乱并且容易出错,因此我建议您在strict: true文件中始终使用tsconfig.json

此处提供了有关各种编译器选项的完整文档:https://www.typescriptlang.org/docs/handbook/compiler-options.html

tsconfig.json上的文档通常在此处:https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

有关索引签名的更多信息,请访问:https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html