打字稿未强制执行或检查返回类型

时间:2019-01-24 15:48:22

标签: typescript

我们的代码中的错误最终是由以下原因引起的。该方法的输出与0进行比较并返回false。该方法显式声明一个数字返回类型,但允许返回字符串。我本来希望在编译器和lint之间的某个点将其标记为错误,但从未被捕获。

比较:

if(routerIdParameter() === 0) {
  console.log('They match');
} else {
  console.log('They do not match');
}

方法:

public routerIdParameter(): number {
  if (this.route.snapshot.paramMap.has('id')) {
    return this.route.snapshot.params['id'];
  } else {
    return 0;
  }
}

显然问题行是返回this.route.snapshot.params ['id'] 。 params类型是 [key:string]:任何,因此它不知道类型,在这里我以为类型检查会抱怨。 用 + 作为前缀很容易,但是我更担心在理解为什么允许它方面的空白。

对于这种情况为什么发生或如何使其出错的任何解释,我都会很感激,因为我担心整个应用程序中可能会有更多这种情况。

在打字稿2.3.4中已标识,但在3.1.6中也已复制

this.route是从@ angular / router导入的ActivatedRoute类型

1 个答案:

答案 0 :(得分:4)

根据定义,

any可以分配给任何类型,也可以分配给任何类型。没有编译器设置可以使其更严格。

在可能的情况下,您应该首选unknown(在打字稿3.0中引入),它可以从任何类型分配,但不能分配给任何类型(有关any与{{ 1}})。

关于如何避免这种行为,我建议研究tslint规则here