【问题标题】:How to make Typescript throw runtime error?如何让 Typescript 抛出运行时错误?
【发布时间】:2022-01-15 20:58:36
【问题描述】:
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
 constructor() {
   console.log(this.getColor(1000))
}
getColor(c:String) {
  return c
}
}

我的文本编辑器在 1000 下方放了一条红线,上面写着:“1000”类型的参数不可分配给“字符串”类型的参数。ts(2345)

好的...但是我的应用程序仍在执行,我可以在控制台上看到结果。

有没有什么方法可以让 Angular 和/或 Typescript 在这样的场景中阻止执行?

【问题讨论】:

  • Typescript 对运行时一无所知。它是一个编译器。可能有一种方法可以让 Angular(在运行时确实存在)来做到这一点,我不知道它是否与 React 的 prop-types 等效,但 Typescript 除了不允许您的代码编译之外不会帮助您.
  • @JaredSmith 我在 TypeScript 问题上看到了很多这样的回应,我同意其中一些,但我一直对 TypeScript“在运行时什么都不做”持开放态度。是的,它是一个编译器——输出运行的代码。他们对此并没有走得太远,但枚举是一个完美的例子,我认为在运行时在 javascript 中没有这样的东西,但 TypeScript 正在为你初始化一个 const 对象(在输出代码中)......从技术上讲,它可以处理 OP 的情况——不过我不确定他们是否实现了任何东西。
  • 这是我前几天遇到的一个例子(仍然有点过头了)——他们正在用 TypeScript 做一些非常有趣的事情,甚至显示错误消息(在运行时)来自编译器。看到这种东西让我对 TypeScript 可以在输出代码中做什么并影响运行时间保持开放的态度......
  • 链接太长了,所以这里是 SO 帖子,链接在第一个答案中 - 这部剧在运行时显示了一些类型错误:stackoverflow.com/questions/58528248/… github 中有一个长线程可供阅读历史:github.com/microsoft/TypeScript/issues/1573

标签: angular typescript


【解决方案1】:

Typescript 只是警告你,有些事情是不对的。它仍然可以编译,您仍然可以运行代码并且它可以工作,但它不打算那样工作。

那么如何检查输入是否正确?

function example (color: string): void {
  if (typeof color !== 'string') {
    throw Error() // you can put your error message in here
  }
}

更新 15.01.2022

我建议稍微改变一下我的上述解决方案。有了新的打字稿功能,您可以编写

interface IColor extends string

function isColor(color: any): color is IColor {
  if (typeof color !== 'string') return false
  return true
}

function example (input: string): void {
  if (isColor(input)) {
    throw Error() // you can put your error message in here
  }
  // everything you wanna do here
}

与我的旧建议相比的一些优势:

  • IColor 可以更改或扩展为数字或十六进制
  • isColor 可用于任何地方检查某物是否为有效颜色

【讨论】:

    【解决方案2】:

    您的浏览器不知道 TypeScript,它只执行转译的 javascript 代码。

    但在您的情况下,构建过程(由 Angular 制作)会引发错误,您将无法部署您的应用程序。

    在开发模式下会引发打字稿错误,但出于实际原因您仍然可以执行应用程序

    【讨论】:

      【解决方案3】:

      您可以configure your compiler--noEmitOnError

      如果报告了任何错误,请不要发出输出。

      虽然这本身不会“阻止执行”,但它会避免 Typescript 故意允许您在检测到类型错误时发出。来自 Typescript issue 828 中的 TypeScript 开发负责人 RyanCavanaugh,该命令行标志是在其中创建的:

      我们绝对想要编译器在出现类型错误时可以发出的行为。这是迁移现有 JavaScript 的关键场景——您将一些 .js 文件重命名为 .ts,得到一些类型错误,但希望在重构它以删除类型错误时继续编译它。从这个意义上说,它们是“警告”;我们不能保证您的程序不能仅仅因为它有类型错误而工作。

      也就是说,我们认识到这并不总是您想要的行为。增量构建经常会因此而混乱。我们需要一些东西来解决这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-06
        • 2012-05-03
        • 2013-06-04
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 2018-04-19
        相关资源
        最近更新 更多