您好我正在开发角度为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的类型。有人可以帮我解决这个问题吗?谢谢。
答案 0 :(得分:1)
你的方法不起作用。
对于初学者,typeof error
肯定会始终返回'object'
,除非error
是undefined
。然后它将返回'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;
}
}
希望这会对你有所帮助。