如何声明一个在Typescript中引发错误的函数

The*_*224 16 typescript

在Java中,我将这样声明一个函数:

public boolean Test(boolean test) throws Exception {
  if (test == true)
    return false;
  throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)

而且我可以使用此功能而无需处理异常。

如果可能,如何在Typescript中执行相同的操作?编译器会告诉我,如果没有try / catch,我将无法使用该函数。

Est*_*ask 17

TypeScript中没有此类功能。仅当函数返回错误而不抛出错误时才可以指定错误类型(这种情况很少发生,并且容易成为反模式)。

唯一相关的类型是never。仅当函数肯定抛出错误时才适用,并且不能比此更具体。与其他类型一样,只要不引起类型问题,就不会引起类型错误:

function Test(): never => {
  throw new Error();
}

Test(); // won't cause type error
let test: boolean = Test(); // will cause type error
Run Code Online (Sandbox Code Playgroud)

当函数有可能返回值时,never将被返回类型吸收。

可以在函数签名中指定它,但仅供参考:

function Test(test: boolean): boolean | never {
  if (test === true)
    return false;

  throw new Error();
}
Run Code Online (Sandbox Code Playgroud)

它可以向开发人员提示可能会发生未处理的错误(如果从函数体中看不到该错误),但这不会影响类型检查并且无法强制执行try..catch(test: boolean) => boolean通过键入系统来考虑此函数的类型。

  • “通过键入系统以返回类型来代替`never`”……从技术上讲这是错误的。您不必在返回类型中指定“从不”的原因是,在联合中,其他所有类型都“吸收”它。所以`boolean | never`被简化为`boolean`,就像`anything ||一样。false”简化为“ anything”:从任何意义上讲,所有*吸收“ false”。在某种程度上,“从不”与[`unknown`]相反(https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#new-unknown-top-type ),它在一个联合中“占主导”,而在一个交叉点中“被吸收”。 (4认同)
  • @chharvey 只是一个简短的说明:`任何东西|| false` 不会简化为“anything”(除非您的意思是“anything”代表所有真实值,但这还不清楚)。如果“||”的左侧为假,则无论其值如何,JavaScript 都会采用右侧。尝试`null || 在控制台中输入 false`,您会看到得到“false”。 (3认同)
  • 很好,感谢“never”解决方案,它消除了编译器错误,迫使我们在返回类型中添加“undefined”,如果我们有一个带有“void”的包装器错误处理函数,该函数返回 TS def 的 undefined。基本上是“无效与从不”。 (2认同)

som*_*pnd 11

目前是不可能的。您可以查看此请求的功能:https : //github.com/microsoft/TypeScript/issues/13219


Art*_*sun 9

@throws至少可以使用jsdoc标记该函数。即使它不提供打字稿编译器的静态分析错误,一些不错的IDE或棉短绒可能仍然报告警告,如果你尝试忽略抛出的功能...

/** 
 * @throws {Error}
 */
function someFunc() {
    if (Math.random() < 0.5) throw Error();
}
someFunc();
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 我检查了 eslint-plugin-jsdoc,但我的理解是 require-throws 规则仅强制将异常记录在 JSDoc 中。遗憾的是,它并没有在使用该函数的代码中强制执行 try-catch 语句,而这正是我们许多人正在寻找的。还有其他选择吗? (7认同)