如何声明在Typescript中抛出错误的函数
在Java中,我将声明如下函数:如何声明在Typescript中抛出错误的函数,typescript,Typescript,在Java中,我将声明如下函数: public boolean Test(boolean test) throws Exception { if (test == true) return false; throw new Exception(); } 我可以在不处理异常的情况下使用这个函数 如果可能,如何在Typescript中执行相同的操作?编译器会告诉我,如果没有try/catch,我无法使用该函数。TypeScript中没有此类功能。只有当函数返回错误而不是抛出错误时,
public boolean Test(boolean test) throws Exception {
if (test == true)
return false;
throw new Exception();
}
我可以在不处理异常的情况下使用这个函数
如果可能,如何在Typescript中执行相同的操作?编译器会告诉我,如果没有try/catch,我无法使用该函数。TypeScript中没有此类功能。只有当函数返回错误而不是抛出错误时,才可以指定错误类型(这种情况很少发生,而且很容易成为反模式) 唯一相关的类型是。它仅在函数确实抛出错误时才适用,不能比这更具体。它与任何其他类型一样,只要不会导致类型问题,就不会导致类型错误:
function Test(): never => {
throw new Error();
}
Test(); // won't cause type error
let test: boolean = Test(); // will cause type error
当函数有可能返回值时,never
被返回类型吸收
可以在函数签名中指定,但仅供参考:
function Test(test: boolean): boolean | never {
if (test === true)
return false;
throw new Error();
}
它可以向开发人员提示可能存在未经处理的错误(在函数体中不清楚的情况下),但这不会影响类型检查,并且不能强制
try..catch
;键入系统将此函数的类型视为(测试:boolean)=>boolean
。目前不可能。您可以签出此请求的功能:
您不能使用纯ts(v您可以将JavaScript的
错误
视为Java的运行时异常
(未经检查的异常)。
您可以扩展JavaScript的Error
,但是要恢复原型链,因为Error
会破坏原型链。setPrototypeOf的需要也在中进行了解释
你至少可以用jsdoc标记函数。即使它在typescript编译器中没有提供静态分析错误,如果你试图忽略抛出
/**
*@throws{Error}
*/
函数someFunc(){
if(Math.random()<0.5)抛出错误();
}
someFunc();
不是TypeScript,但可能对另一种JavaScript类型检查器感兴趣,它具有此功能。您可以这样写:
function Test(test: boolean): boolean | $Throws<Exception> {
if (test)
return false;
throw new Exception();
}
函数测试(测试:布尔):布尔|$Throws{
如果(测试)
返回false;
抛出新异常();
}
请参见否不可能不确定您是否正在查找
错误
类,请检查下面的我的答案您可以通过装饰器对其进行注释,以指示该方法可能会抛出,但没有什么可以强制执行。您必须检查注释,以便在每次调用该方法时进行检查。“never
通过键入系统而忽略,以支持返回类型”…这在技术上是不正确的。您不必在返回类型中指定never
的原因是,在联合中,其他所有类型都吸收它。因此boolean | never
被简化为boolean
,就像anything | false
如何简化为anything
:在析取中,任何东西都吸收false
。从某种意义上说,从不
与之相反,它在联盟中占主导地位,并被交叉路口所吸引。谢谢你的通知。事实上,吸附在这里是正确的术语。@chharvey只是一个简短的提示:任何东西| |假
都不能简化为任何东西
(除非你想让任何东西
代表所有真实的价值观,但这并不清楚)。如果|
的左侧是错误的,JavaScript将使用右侧,而不管其值如何。在控制台中尝试null | | false
,您将看到您得到false
@willurd是的,这是一个次要的技术性问题,但您是对的。我应该说anything | truthy | false
简化为anything | truthyode>。感谢您的更正。区别在于anything|truthy | false
是一个在运行时短路的表达式,而boolean | never
是一个静态简化的类型。很好,感谢never
解决方案,它使编译器错误静音,迫使我们将未定义的
添加到返回中如果我们有一个带有void
的包装错误处理函数,它返回未定义的TS def。基本上void vs never
。Just fyithrow
不是一个表达式,因此它在三元结构中的用法是不正确的
function Test(test: boolean): boolean | $Throws<Exception> {
if (test)
return false;
throw new Exception();
}