这是一个简单的例子,使我感到困惑:
interface Test {
key1: string;
'attr.innerKey': string
}
const test: Test = {
key1: 'I am a key',
'attr.innerKey': 'innerKey'
}
test.key2 = 'I am key 2'; // here comes an error for there's no key2 in test
test['attr.innerKey2'] = 'error'; // Some how this works
通过这行代码test['attr.innerKey2'] = 'error';
很奇怪。
是错误还是某些特殊功能?
答案 0 :(得分:4)
这是默认的编译器行为。默认情况下,为了简化从JS的迁移并且不破坏现有代码,Typescript禁用了其更严格的功能。
这样,即使编译器知道类型提示它应该失败,对键的动态访问(使用[]
)也总是成功的,并且此索引访问的结果为any
。根据类型检查静态访问(即.
),并且在不存在的属性上失败。之所以如此,是因为人们通常使用.
进行常规访问,但是使用[]
进行动态访问。
如果您使用[]
编译器选项,也可以告诉编译器您也希望它检查noImplicitAny
的访问权限(尽管如果要启动新项目,我建议您使用strict
并禁用您发现特别烦人的内容,或者最好禁用任何内容)。
noImplictAny
选项还会出现很多其他错误,例如缺少参数类型,因此在现有代码库上启用它通常会有些痛苦(这是将JS转换为TS中的最大障碍。我的经验),但结果值得。