web-dev-qa-db-ja.com

Angular HttpClientは、observable <any>ではなくobservable <HttpEvent <any>を期待して返します

HttpClientを使用すると、戻り値の型でコンパイルエラーが発生します。私の関数GetPortfolioでは、GET呼び出しがObservable<Portfolio>型のjsonオブジェクトを返すことを期待していますが、エラーが発生しています:

タイプ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);
   }

}

angular hero tutorial and docs HttpClientリクエストはObservable<any>を期待する必要があります: Angular HttpClient doc

だから私は何か間違ったことをしていますか?または、戻り値をObservable<HttpEvent<Portfolio>>に設定する必要がありますか?

15
roverred

奇妙なことですが、書いてもエラーを出さないでください

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

コンパイラは、properites headers、params、observe ...を持つオブジェクトを期待していますが、オブジェクトに型がないため、コンパイラはそれを受け入れることができます

あなたでもできる

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

HttpOptionsを型キャストする

private httpOptions: {
    headers: HttpHeaders
};

TypeScriptコンパイラが間違った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>>;

ヘッダーでタイプを指定すると、正しいタイプが取得されます。 ( 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>;
25
LLai

私はこのようにヘッダーパラメータをキャストすることを解決します

return this.http.get<SomeModel>(someUrl, <Object>this.options);
3
koutat cruzado

これはサービス「PortfolioService」であるため、ここではインターフェイスは必要ないかもしれませんが、代わりにanyタイプを使用できます。また、GETメソッドもここでのみ必要です。

GetPortfolio(portfolioId): Observable<any> {
  return this.http.get(this.apiUrl + '/${portfolioId}')
         .map((response:any) => {
              return response;
         });
}

これは動作するはずです、試してください。

0
nithalqb