如何在Type脚本中检查从API接收的对象类型?

时间:2018-04-11 07:57:20

标签: typescript exception-handling

您好我正在开发角度为2的Web应用程序。我正在处理异常处理机制。我创建了一个模型,它与我将从服务器(ERROR DTO)接收的对象相同。

下面是我的错误处理程序代码。

protected handleError(error, continuation: () => Observable<any>) {
        if (error.status == 401) {
            this.appContextService.redirectForLogin();
        }
        else if (typeof error == ErrorDTO) {
            return Observable.throw(error);
        }
        else {

            return Observable.throw(error);
        }
    }

API也可以抛出我的ErrorDTO以外的对象。我想处理这个问题。第二个else语句typeof error == ErrorDTO无法正常工作。在这里,我想检查我得到的错误DTO是否是相同类型的ErrorDTO。这个特殊的语句是抛出错误算符==不能应用于类型字符串和错误DTO的类型。有人可以帮我解决这个问题吗?谢谢。

1 个答案:

答案 0 :(得分:1)

你的方法不起作用。

对于初学者,typeof error肯定会始终返回'object',除非errorundefined。然后它将返回'undefined'

您可能会想到instanceof,其效果与您想要的更相似:(new Number(23)) instanceof Number - &gt; true

然而,问题在于,如果ErrorDTO是一个接口,那么在转换代码时,类型信息将消失(您不能将instanceof与接口一起使用)。你可以将它声明为类,但是,如果对象error是解析服务返回的JSON的结果(我认为是),那么它将始终只是一个普通的object。毕竟,instanceof使用原型来确定对象是否是另一个对象的实例。 parsin JSON产生的每个对象都有Object.prototype作为其原型:

你可能有类似的东西:

class ErrorDTO { ... }

// in a service:
(...).subscribe({ error: error => error as ErrorDTO});

这可能适用于TypeScript,但是,如果你这样做:

error instanceof ErrorDTO

你会得到false,因为你告诉TypeScript error类型为ErrorDTO,但事实是它不是,即使它共享相同属性。

我的建议是你以另一种方式确定你的错误。也许你的错误在你的后端有errorCode属性,然后,你可以在你的客户端代码中有一个接口:

interface BaseError {
    errorCode: number
    status: number
    // ... other props ...
}

您可以从BaseError派生其他错误接口。然后,您的handleError方法将接受BaseError类型的对象:

protected handleError(error: BaseError, continuation: () => Observable<any>) {
    if (error.status === 401) {
        ...
    } else switch (error.errorCode) {
          case XXX:
             ...
             break;
          case YYY:
             ...
             break;
    }
}

希望这会对你有所帮助。