0

在我的 Angular 4 项目中,我使用的是 HTTP 客户端,当我进行 GET 调用时,有时会明确响应,因此我必须执行以下操作:

 this.loggedUser.name = response._embedded.agent.name

但在这种情况下,我有这个错误:

“HttpResponse”类型上不存在属性“_embedded”

我解决了将响应转换为任何问题的问题:

getLoggedUser(url) {
return this.http.get(url, {observe: 'response'})
.map((response) => <any>response);
}

那么,我是否必须对所有响应进行强制转换?这被认为是好的做法,还是我应该做其他事情?

4

1 回答 1

2

该类HttpResponse<T>确实没有任何_embedded属性。这就是你得到编译器错误的原因,因为 Typescript 静态地键入了你的响应HttpResponse<Object>(泛型类型参数用于body响应的属性)。

在这种情况下,将响应投射到<any>似乎是一个可行的解决方案,如果您知道随时期待_embedded那里的道具。不过,空检查可能是一个不错的补充。

这是HttpResponse<T>供参考的打字:

/**
 * A full HTTP response, including a typed response body (which may be `null`
 * if one was not returned).
 *
 * `HttpResponse` is a `HttpEvent` available on the response event
 * stream.
 *
 * @experimental
 */
export declare class HttpResponse<T> extends HttpResponseBase {
    /**
     * The response body, or `null` if one was not returned.
     */
    readonly body: T | null;
    /**
     * Construct a new `HttpResponse`.
     */
    constructor(init?: {
        body?: T | null;
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    });
    readonly type: HttpEventType.Response;
    clone(): HttpResponse<T>;
    clone(update: {
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    }): HttpResponse<T>;
    clone<V>(update: {
        body?: V | null;
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    }): HttpResponse<V>;
}
于 2017-09-06T11:41:16.437 回答