如何在typescript中区分具有相同结构的不同异常/类

如何在typescript中区分具有相同结构的不同异常/类,typescript,error-handling,Typescript,Error Handling,我知道Typescript已经成功了。但是对于我的用例,我需要区分具有相同结构的不同类型的异常。有没有简单的方法来完成它?我正在考虑在每个字段中添加一些独特的字段,但我更喜欢只需要更改父错误的解决方案 class FooError extends Error {}; class BarError extends Error {}; function doSomething(): void | FooError { return new BarError(); } 为了实现这一

我知道Typescript已经成功了。但是对于我的用例,我需要区分具有相同结构的不同类型的异常。有没有简单的方法来完成它?我正在考虑在每个字段中添加一些独特的字段,但我更喜欢只需要更改父错误的解决方案

class FooError extends Error {};
class BarError extends Error {};

function doSomething(): void | FooError {
    return new BarError();    
}

为了实现这一点,您的子类需要在结构上彼此不同。您不能通过只修改父类来实现这一点

为了将子类彼此区分开来,您可以向每个子类添加一个
private
protected
字段。私有字段是名义上处理的,而不是结构上处理的,因此如果需要,它们甚至可以具有相同的结构:

class FooError extends Error {
    private __prop?: any; // needs to be in each subclass, despite looking the same
};
class BarError extends Error {
    private __prop?: any; // needs to be in each subclass, despite looking the same
};

function doSomething(): void | FooError {
    return new BarError();    // error
}
但我建议改为添加一个有区别的字段,如下所示:

class FooError extends Error {
    readonly type = "FooError";
};
class BarError extends Error {
    readonly type = "BarError";
};

function doSomething(): void | FooError {
    return new BarError();    // error
}
因为您可以在编译时和运行时使用它来区分
foorerror
BarError

function distinguishError(err: FooError | BarError) {
    if (err.type === "BarError") {
        err // BarError
    } else {
        err // FooError
    }
}

如果不改变每个子类的结构,就无法区分它们。所以,如果你想让它起作用,你必须做一些类似的事情。