Angular HttpClient返回期望可观察的<HttpEvent <any>而不是observable <any>

rov*_*red 16 angular angular-httpclient

使用HttpClient时,我在返回类型上遇到编译错误.在我的函数中GetPortfolio,我期望GET调用返回类型的json对象,Observable<Portfolio>但是它给出了错误:

类型Observable<HttpEvent<Portfolio>>不能分配给类型Observable<Portfolio>.类型HttpEvent<Portfolio>不能分配给类型Portfolio.类型HttpProgressEvent不能分配给类型Portfolio.属性name缺少类型HttpProgressEvent.

我的代码:

import { Injectable } from '@angular/core';
import { environment } from './environments/environment';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';


export interface Portfolio {
  name: string;
  id: string;
}

@Injectable()
export class PortfolioService {

    private httpOptions;

    apiUrl: string;

    constructor(private http: HttpClient) {
      this.apiUrl = environment.apiUrl + "/api/portfolios";

      this.httpOptions = {
        headers: new HttpHeaders(
          {
            'Content-Type': 'application/json',
          })   
      };
    }


    GetPortfolio(portfolioId: string): Observable<Portfolio> {
      return this.http.get<Portfolio>(this.apiUrl + '/${portfolioId}', this.httpOptions);
   }

}
Run Code Online (Sandbox Code Playgroud)

从角度英雄教程和文档HttpClient请求应该期望Observable<any>:Angular HttpClient doc

我做错了什么?或者我应该将返回值设置为Observable<HttpEvent<Portfolio>>

LLa*_*Lai 27

Typecast你的httpOptions

private httpOptions: {
    headers: HttpHeaders
};
Run Code Online (Sandbox Code Playgroud)

打字稿编译器拉错了get方法类型(src)

/**
* Construct a GET request which interprets the body as JSON and returns the full event stream.
*
* @return an `Observable` of all `HttpEvent`s for the request, with a body type of `T`.
*/
get<T>(url: string, options: {
    headers?: HttpHeaders | {[header: string]: string | string[]},
    observe: 'events',
    params?: HttpParams|{[param: string]: string | string[]},
    reportProgress?: boolean,
    responseType?: 'json',
    withCredentials?: boolean,
}): Observable<HttpEvent<T>>;
Run Code Online (Sandbox Code Playgroud)

当您指定带有标题的类型时,它会提取正确的类型.(src)

/**
* Construct a GET request which interprets the body as JSON and returns it.
*
* @return an `Observable` of the body as type `T`.
*/
get<T>(url: string, options?: {
    headers?: HttpHeaders | {[header: string]: string | string[]},
    observe?: 'body',
    params?: HttpParams|{[param: string]: string | string[]},
    reportProgress?: boolean,
    responseType?: 'json',
    withCredentials?: boolean,
}): Observable<T>;
Run Code Online (Sandbox Code Playgroud)

  • 这就是我的答案,但这太荒谬了。如果您不小心输入内容,则会使整个http客户端设计过度,并且难以调试。我没有当场添加http选项,而是将它们作为全局提供的值放置在应用程序的顶部,因此我可以简单地注入并添加到我想要的任何请求中,并根据需要进行覆盖。在构造函数中,我没有将类型指定为'{headers:HttpHeaders}'。 (4认同)

小智 13

我解决了这个问题,像这样投射我的标题参数

return this.http.get<SomeModel>(someUrl, <Object>this.options);
Run Code Online (Sandbox Code Playgroud)

  • 万分感谢。你现在实际上需要做`this.options as object`。 (6认同)

Eli*_*seo 7

这很奇怪,如果你写的话不要给错误

GetPortfolio(portfolioId: string): Observable<Portfolio> {
    return this.http.get<Portfolio>('....', {
        headers: new HttpHeaders(
            {
                'Content-Type': 'application/json',
            })   
    });
}
Run Code Online (Sandbox Code Playgroud)

看起来,编译器期望一个对象具有正确的头,参数,观察......,但由于你的对象没有类型,编译器可以接受它

即使你能做到

headers: HttpHeaders = new HttpHeaders({
        'Content-Type': 'application/json',
    })
GetPortfolio(portfolioId: string): Observable<Portfolio> {
        return this.http.get<Portfolio>('...', {
            headers: this.headers
        })
    }
Run Code Online (Sandbox Code Playgroud)