如何在 Typescript 中检查从 API 接收到的对象类型?
How to check type of object received from API in Type script?
您好,我正在 angular 开发 Web 应用程序 2. 我正在研究异常处理机制。我创建了一个模型,它与我将从服务器接收的对象相同(错误 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 类型。有人可以帮我解决这个问题吗?谢谢。
你的方法行不通。
首先,typeof error
肯定会 return 'object'
,除非 error
是 undefined
。然后它将 return 'undefined'
.
您可能会想到 instanceof
,它与您想要的更相似:(new Number(23)) instanceof Number
-> true
.
然而,问题是如果 ErrorDTO
是一个接口,那么在转换代码时类型信息将消失(你不能将 instanceof
与接口一起使用)。您可以将其声明为 class,但是,如果对象 error
是由服务解析 JSON return 的结果(我假设是),那么它永远只是一个普通的 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;
}
}
希望对您有所帮助。
您好,我正在 angular 开发 Web 应用程序 2. 我正在研究异常处理机制。我创建了一个模型,它与我将从服务器接收的对象相同(错误 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 类型。有人可以帮我解决这个问题吗?谢谢。
你的方法行不通。
首先,typeof error
肯定会 return 'object'
,除非 error
是 undefined
。然后它将 return 'undefined'
.
您可能会想到 instanceof
,它与您想要的更相似:(new Number(23)) instanceof Number
-> true
.
然而,问题是如果 ErrorDTO
是一个接口,那么在转换代码时类型信息将消失(你不能将 instanceof
与接口一起使用)。您可以将其声明为 class,但是,如果对象 error
是由服务解析 JSON return 的结果(我假设是),那么它永远只是一个普通的 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;
}
}
希望对您有所帮助。