界面怪异行为

时间:2019-04-19 09:25:30

标签: typescript

这是一个简单的例子,使我感到困惑:

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';很奇怪。

是错误还是某些特殊功能?

1 个答案:

答案 0 :(得分:4)

这是默认的编译器行为。默认情况下,为了简化从JS的迁移并且不破坏现有代码,Typescript禁用了其更严格的功能。

这样,即使编译器知道类型提示它应该失败,对键的动态访问(使用[])也总是成功的,并且此索引访问的结果为any。根据类型检查静态访问(即.),并且在不存在的属性上失败。之所以如此,是因为人们通常使用.进行常规访问,但是使用[]进行动态访问。

如果您使用[]编译器选项,也可以告诉编译器您也希望它检查noImplicitAny的访问权限(尽管如果要启动新项目,我建议您使用strict并禁用您发现特别烦人的内容,或者最好禁用任何内容)。

noImplictAny选项还会出现很多其他错误,例如缺少参数类型,因此在现有代码库上启用它通常会有些痛苦(这是将JS转换为TS中的最大障碍。我的经验),但结果值得。