如何在 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',除非 errorundefined。然后它将 return 'undefined'.

您可能会想到 instanceof,它与您想要的更相似:(new Number(23)) instanceof Number -> true.

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

你可能有这样的东西:

class ErrorDTO { ... }

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

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

error instanceof ErrorDTO

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

我的建议是你用另一种方式来确定你的错误。也许你的错误在你的后端有一个 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;
    }
}

希望对您有所帮助。