Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何声明在Typescript中抛出错误的函数_Typescript - Fatal编程技术网

如何声明在Typescript中抛出错误的函数

如何声明在Typescript中抛出错误的函数,typescript,Typescript,在Java中,我将声明如下函数: public boolean Test(boolean test) throws Exception { if (test == true) return false; throw new Exception(); } 我可以在不处理异常的情况下使用这个函数 如果可能,如何在Typescript中执行相同的操作?编译器会告诉我,如果没有try/catch,我无法使用该函数。TypeScript中没有此类功能。只有当函数返回错误而不是抛出错误时,

在Java中,我将声明如下函数:

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 fyi
throw
不是一个表达式,因此它在三元结构中的用法是不正确的
function Test(test: boolean): boolean | $Throws<Exception> {
  if (test)
    return false;
  throw new Exception();
}