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>>
に設定する必要がありますか?
奇妙なことですが、書いてもエラーを出さないでください
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
})
}
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>;
私はこのようにヘッダーパラメータをキャストすることを解決します
return this.http.get<SomeModel>(someUrl, <Object>this.options);
これはサービス「PortfolioService」であるため、ここではインターフェイスは必要ないかもしれませんが、代わりにanyタイプを使用できます。また、GETメソッドもここでのみ必要です。
GetPortfolio(portfolioId): Observable<any> {
return this.http.get(this.apiUrl + '/${portfolioId}')
.map((response:any) => {
return response;
});
}
これは動作するはずです、試してください。