【问题标题】:Typescript not enforcing or checking return type打字稿不强制或检查返回类型
【发布时间】:2019-01-24 23:53:21
【问题描述】:

我们代码中的一个错误最终是由以下原因引起的。该方法的输出与 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;
  }
}

显然问题是 return this.route.snapshot.params['id']。 params type 是 [key: string]: any 所以它不知道类型,而且我认为类型检查会抱怨。 用 + 前缀很容易解决,但我更担心我在理解为什么允许它方面存在差距。

任何关于为什么会发生这种情况或如何使其出错的解释都将不胜感激,因为我担心在我们的应用程序中可能会有更多这样的情况。

在 typescript 2.3.4 中标识,但也在 3.1.6 中复制

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    在可能的情况下,您应该更喜欢 unknown(在 typescript 3.0 中引入),它可以从任何类型分配,但不能分配给任何类型(阅读 here 以获取有关 anyunknown 的更多信息)。

    至于如何避免这种行为,我建议查看 tslint 规则 no-unsafe-any

    【讨论】:

    • 感谢您的信息。 no-unsafe-any 已标记问题行(以及其他 1,119 个!)所以看起来是我将使用的方法。
    猜你喜欢
    • 2019-08-04
    • 2018-11-03
    • 2017-05-16
    • 2020-12-25
    • 2020-06-29
    • 2021-11-19
    • 2020-07-08
    • 2021-08-15
    • 2021-05-14
    相关资源
    最近更新 更多