【问题标题】:How to track whether a function can throw in TypeScript?如何跟踪函数是否可以在 TypeScript 中抛出?
【发布时间】:2019-03-03 14:41:04
【问题描述】:

announcement for js-sys 说:

我们考虑过 TypeScript 前端,但没有优先考虑它,因为 TypeScript 没有描述函数是否抛出异常

1) 这是正确的吗? 2)如果不是,有什么方法可以标记函数是否可以在TS中抛出?编译器有什么方法可以提供帮助吗?

这里有两个解决方案。第一个实际上并不检查类型,但它们至少作为与其他程序员交流的一种方式是可见的。第二种方法进行了一些有限的检查,但运行时间成本较低且需要人工操作。

// unchecked solution
type OrThrow<T> = T;

function add(a: number, b: number): OrThrow<number> {
    return a + b;
}

// checked solution with run-time cost and manual work
type Exn<T> = T & { __canThrow: true };

function exn<T>(t: T): Exn<T> {
    return t as Exn<T>;
}

function sum(a: number, b: number): Exn<number> {
    return exn(a + b);
}

【问题讨论】:

  • 我相信这与 TypeScript 与 JavaScript 的关系有关......基本上任何代码都可以引发异常,即使它的类型正确。例如,尝试访问未定义属性或变量 (data.data.data) 上的属性路径。也就是说 any 函数可以引发运行时异常。但是,无法指定可能引发的错误类型。
  • 你想要this feature,我想。到那边去???如果您认为自己有一个令人信服的用例尚未讨论,或者发表评论。
  • @ExplosionPills,明白了,这更多是关于通过函数在某些情况下要抛出的类型进行通信。我提供了两个例子来说明如何做到这一点,但都不喜欢。
  • 这个问题与受检异常没有直接关系,而是对受检异常的有趣讨论here

标签: typescript exception types


【解决方案1】:

无法形容。
跟踪它的一种选择可能是使用 Result/Either 类型,用于 Rust、Scala、OCaml 和 Haskell 等更强类型的语言。
您可能还对所使用的运行时成本感兴趣(新类型模式)。 Example 实际上使用了更深的嵌套和更多的开销,而成本基本上没有。

【讨论】:

  • Result/Either/Maybe 可以在 TS 中很好地表示,但这不是我要问的。我提出的第二种解决方案似乎符合“描述函数是否抛出”的标准,但我正在检查我的理解并询问是否有更好的方法。
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2013-03-20
  • 2022-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多