我正试图从HTTP调用中获得完整响应。根据Angular文档,我应该将HTTP调用"options">设置为{observe: 'response'}
如果我这样做,我会得到以下错误:
Type 'Observable<HttpResponse<IItem[]>>' is not assignable to type 'Observable<IItem[]>'. Type 'HttpResponse<IItem[]>' is not assignable to type 'IItem[]'. Property 'includes' is missing in type 'HttpResponse<IItem[]>'.
我认为我关于Observables&打字/铸造不太清楚。
我收到了一个HTTPGet请求,它返回了一个可观察到的且强的将其键入项目数组中的(见下文)
getItems(): Observable <IItem[]>{
return this._http.get<IItem[]>(url, {observe: 'response'})
.do(data => console.log('All: ' + JSON.stringify(data)))
};
我尝试设置getUsers(): Observable <HttpResponse<IUser[]>>
,它解决了上述错误,但在我的subscribe
中,当我尝试将返回的数据分配给局部变量this.item = data;
时,我得到了以下错误,其中item
被声明为item: Item[]
Type 'Observable<HttpResponse<IItem[]>>' is not assignable to type 'IItem[]
所以我的问题是:
- 如何解决上述错误(以及为什么会出现此错误)
- 这可能是一个愚蠢的问题,但如果
._http.get<IItem[]>
已经设置了预期的响应"类型",我还需要设置getItems(): Observable <IItem[]>
方法的返回类型吗
我想我不理解导致这种混乱的一些基本概念。任何帮助都将不胜感激。我是Angular 4的新手,所以请温柔一点。
HttpClient.get
方法被定义为使用泛型类型T
:
get<T>(url: string, options?: {
...
}): Observable<T>;
因此,由于根据定义将<IItem[]>
传递给get
方法(此处为this._http.get<IItem[]>
),因此get
方法返回HttpResponse<IItem[]>
对象。然而,您声明方法getItems
返回IItem[]
,因此会得到错误:
键入'Observable<HttpResponse<IItem[]>gt;'不可分配给类型'可观察<IItem[]>'。
要修复它,您需要返回IItem[]
。这可以通过从HttpResponse<IItem[]>
中提取类型为IItem[]
的主体并返回它来完成。do
运算符不能返回任何内容,因此必须使用map
运算符:
this._http.get<IItem[]>('url', {observe: 'response'})
.do(data => console.log('All: ' + JSON.stringify(data)))
.map(data => data.body)
这应该有效:
getItems(): Observable <IItem[]>{
return this.http
.get<IItem[]>(url, {observe: 'response'})
.do(data => console.log('All: ' + JSON.stringify(data)))
.map( (r: HttpResponse<IItem[]> ) => r.body )
};