采用以下代码段,我希望第二行出现错误,但是没有一个。
const foo = { someKey: 'foo' };
foo['NonExistentKey'].bar.baz // no errors
foo.NonExistentKey.bar.baz // NonExistentKey doesn't exist
有什么办法可以捕捉到这个吗?
答案 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