Typescript 为什么';t obj[';不存在的密钥';]是否在TS中引发错误?

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的转换更容易,人们认为对对象的动态访问,即使用[]的访问不应该出错,只返回任何错误 这当然是类型系统中的一个非常大的漏洞,

以下面的代码片段为例,我希望第2行出现错误,但没有

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
上的文档一般如下:

有关索引签名的更多信息,请参见: