每当该函数可能引发错误时,我们是否应该从函数中返回never
?例如
function verifyIferror(): never | void {
if (someCondition) {
throw 'My Error';
}
}
还是仅仅返回void
是否正确?
此外,在调用此函数的函数中返回never
是否正确?例如
function myOuterFunction(): never | number {
verifyIferror();
... some other code ...
return someNumberValue;
}
并返回never
直到我们在某个时候捕获到此异常并以某种不错的方式对其进行处理?
答案 0 :(得分:2)
The never
type是TypeScript的bottom type。这意味着它完全是无人居住的:您可以拥有类型string
或类型RegExp
的值,但是不能拥有类型never
的值。如果您告诉我您有一个never
类型的值,我知道您在骗我。
从逻辑上讲,这意味着对于任何类型A
,联合A | never
与A
的类型相同。毕竟,类型A | never
的值是类型A
的所有值与类型never
的所有值的并集。但是没有类型never
的值,因此意味着类型A | never
的值与类型A
的值相同。因此,A | never
与A
相同,并且可以简化为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}}。
好的,希望对您有所帮助;祝你好运!