当函数抛出错误时,我们不应该返回

时间:2019-12-17 18:48:47

标签: typescript

每当该函数可能引发错误时,我们是否应该从函数中返回never?例如

function verifyIferror(): never | void {
  if (someCondition) {
    throw 'My Error';
  }
}

还是仅仅返回void是否正确?

此外,在调用此函数的函数中返回never是否正确?例如

function myOuterFunction(): never | number {
  verifyIferror();
  ... some other code ...
  return someNumberValue;
}

并返回never直到我们在某个时候捕获到此异常并以某种不错的方式对其进行处理?

1 个答案:

答案 0 :(得分:2)

The never type是TypeScript的bottom type。这意味着它完全是无人居住的:您可以拥有类型string或类型RegExp的值,但是不能拥有类型never的值。如果您告诉我您有一个never类型的值,我知道您在骗我。

从逻辑上讲,这意味着对于任何类型A,联合A | neverA的类型相同。毕竟,类型A | never的值是类型A的所有值与类型never的所有值的并集。但是没有类型never的值,因此意味着类型A | never的值与类型A的值相同。因此,A | neverA相同,并且可以简化为type StringOrNever = string | never; /* type StringOrNever = string */

TypeScript编译器会识别出此错误,并为您执行以下简化操作:

function foo(): string | never {
    if (Math.random() < 0.5) throw new Error("sorry");
    return "hello";
}

您可以通过IntelliSense进行验证。

这意味着尽管这样写签名不是错误

string

它并不能真正为您带来很多收益。甚至使用该函数的人都将返回类型视为never。请注意,这也意味着您可以使用返回值而不必担心never。如果运行时在到达代码之前抛出错误,那么它将根本不会运行,您不必担心。如果将它放入您的代码中,那么就已经消除了const s = foo(); // maybe error here console.log(s.toUpperCase()); // if not, logs HELLO 的可能性(进一步证明抛出错误的错误与返回底部类型相同):

s

string的类型仅为s.toUpperCase(),我可以不受惩罚地写{{1}}。


好的,希望对您有所帮助;祝你好运!

Link to code