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

时间:2018-03-22 17:18:49

标签: typescript

在Java中我会声明一个这样的函数:

public boolean Test(boolean test) throws Exception {
  if (test == true)
    return false;
  throw new Exception();
}

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

如果有可能,如何在打字稿中做同样的事情?编译器会告诉我,如果没有try / catch,我就无法使用该函数。

7 个答案:

答案 0 :(得分:7)

你至少可以用 @throws jsdoc 标记函数。即使它没有在 typescript 编译器中提供静态分析错误,如果你试图忽略抛出的函数,一些好的 IDE 或 linter 可能仍然 report a warning

/** 
 * @throws {Error}
 */
function someFunc() {
    if (Math.random() < 0.5) throw Error();
}
someFunc();

enter image description here

答案 1 :(得分:5)

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

唯一相关的类型是never。它仅适用于函数肯定会抛出错误的情况,它不能更具体。它是一种类型,它不会导致类型错误,只要它不会导致类型问题:

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;通过键入system,此函数的类型被视为(test: boolean) => boolean

答案 2 :(得分:2)

在Typescript / Javascript中,我们有Error类来使用消息而不是Exception类抛出自定义异常。因此,您的代码应如下所示 -

public Test(test:boolean):boolean {
    if (test == true)
      return false;
     throw new Error("Custom error");
   } 

这是完整的代码 -

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    public Test(test:boolean):boolean {
    if (test == true)
      return false;
     throw new Error("Custom error");
   }
}

let greet = new Greeter("Hi");

console.log("output : " + greet.Test(true)); // output :false
console.log("Error : " + greet.Test(false)); //Error: Custom error

link to working fiddle

答案 3 :(得分:0)

目前无法执行。您可以签出此请求的功能: https://github.com/microsoft/TypeScript/issues/23060

答案 4 :(得分:0)

您不能使用纯ts(v <3.9),我希望将来可以使用。 但是,可能的解决方法是,将可能的引发类型隐藏在方法的签名中,然后在catch块中恢复这些类型。 我使用以下解决方法制作了一个软件包:https://www.npmjs.com/package/ts-throwable/v/latest

使用情况大致如下:

import { throwable, getTypedError } from 'ts-throwable';
class CustomError extends Error { /*...*/ }

function brokenMethod(): number & throwable<CustomError> {
    if (Math.random() < 0.5) { return 42 };
    throw new CustomError("Boom!");
}

try {
    const answer: number = brokenMethod()
}
catch(error){
    // `typedError` is now an alias of `error` and typed as `CustomError` 
    const typedError = getTypedError(error, brokenMethod);
}

答案 5 :(得分:0)

您可以将JavaScript的Error视为Java的RuntimeException(未经检查的异常)。 您可以扩展JavaScript的Error,但可以扩展you have to use Object.setPrototypeOf来恢复原型链,因为Error会破坏它。 this answer中也解释了setPrototypeOf的需要。

export class AppError extends Error {
    code: string;

    constructor(message?: string, code?: string) {
        super(message);  // 'Error' breaks prototype chain here
        Object.setPrototypeOf(this, new.target.prototype);  // restore prototype chain
        this.name = 'AppError';
        this.code = code;
    }
}

答案 6 :(得分:0)

不是 TypeScript,但 Hegel 可能会引起人们的兴趣,它是 JavaScript 的另一个类型检查器,具有此功能。你会写:

function Test(test: boolean): boolean | $Throws<Exception> {
  if (test)
    return false;
  throw new Exception();
}

https://hegel.js.org/docs/magic-types#throwserrortype