How to declare a function that throws an error in Typescript

后端 未结 4 906
孤独总比滥情好
孤独总比滥情好 2020-12-18 18:00

In Java I would declare a function like this:

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


        
相关标签:
4条回答
  • 2020-12-18 18:06

    You cannot using pure ts (v<3.9) I hope it will be available in the future. A workaround is however possible, it consists of hiding the possible thrown types in the method's signature to then recover those types in the catch block. I made a package with this workaround here: https://www.npmjs.com/package/ts-throwable/v/latest

    usage is more or less as follow:

    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);
    }
    
    
    0 讨论(0)
  • 2020-12-18 18:11

    You could treat JavaScript's Error as Java's RuntimeException (unchecked exception). You can extend JavaScript's Error but you have to use Object.setPrototypeOf to restore the prototype chain because Error breaks it. The need for setPrototypeOf is explained in this answer too.

    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;
        }
    }
    
    
    0 讨论(0)
  • 2020-12-18 18:18

    There is no such feature in TypeScript. It's possible to specify error type only if a function returns an error, not throws it (this rarely happens and is prone to be antipattern).

    The only relevant type is never. It is applicable only if a function definitely throws an error, it cannot be more specific than that. It's a type as any other, it won't cause type error as long as it doesn't cause type problems:

    function Test(): never => {
      throw new Error();
    }
    
    Test(); // won't cause type error
    let test: boolean = Test(); // will cause type error
    

    When there is a possibility for a function to return a value, never is absorbed by return type.

    It's possible to specify it in function signature, but for reference only:

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

    It can give a hint to a developer that unhandled error is possible (in case when this is unclear from function body), but this doesn't affect type checks and cannot force try..catch; the type of this function is considered (test: boolean) => boolean by typing system.

    0 讨论(0)
  • 2020-12-18 18:21

    It is not possible at this moment. You can check out this requested feature: https://github.com/microsoft/TypeScript/issues/13219

    0 讨论(0)
提交回复
热议问题