Typescript 为什么';t obj[';不存在的密钥';]是否在TS中引发错误?
以下面的代码片段为例,我希望第2行出现错误,但没有Typescript 为什么';t obj[';不存在的密钥';]是否在TS中引发错误?,typescript,Typescript,以下面的代码片段为例,我希望第2行出现错误,但没有 const foo = { someKey: 'foo' }; foo['NonExistentKey'].bar.baz // no errors foo.NonExistentKey.bar.baz // NonExistentKey doesn't exist 有什么方法可以抓住这个问题吗?为了使从JS到TS的转换更容易,人们认为对对象的动态访问,即使用[]的访问不应该出错,只返回任何错误 这当然是类型系统中的一个非常大的漏洞,
const foo = { someKey: 'foo' };
foo['NonExistentKey'].bar.baz // no errors
foo.NonExistentKey.bar.baz // NonExistentKey doesn't exist
有什么方法可以抓住这个问题吗?为了使从JS到TS的转换更容易,人们认为对对象的动态访问,即使用
[]
的访问不应该出错,只返回任何错误
这当然是类型系统中的一个非常大的漏洞,有一个编译器标志来关闭它,该标志称为noImplicitAny
。这将使您的代码引发错误成为预期的错误(但也会使编译器假定的任何位置any
也成为错误)
在操场上,您可以转到选项并启用此选项,您将看到预期的错误。捕获此类错误的最简单方法是启用TypeScript的
严格模式,或者在tsconfig.json
文件中打开noImplicitAny
标志
启用其中一个后,将出现如下错误:
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
是隐式键入的,就像constfoo:{[index:string]:any,someKey:string}
。我认为这样做的理由是,来自JavaScript的人通常会任意索引到任意对象中,并期望它能够工作,因此在非严格模式下,即使不是特别的类型安全,也允许这样做
通常,我发现非严格行为令人困惑且容易出错,因此我建议您在tsconfig.json
文件中始终使用strict:true
有关各种可用编译器选项的完整文档如下:
tsconfig.json
上的文档一般如下:
有关索引签名的更多信息,请参见: