我正在进行Angular课程,我需要使用Http
从服务器获取数据。我有一个名为interface
的{{1}},我有一个应该得到这些事件的服务:
IEvent
然而,当我有这个代码时,我看到一个错误说:
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/observable/throw';
@Injectable()
export class EventService {
constructor(
private _http: Http,
@Inject(...) private _originUrl: string // This is listed in 'providers' in my module
) {}
getEvents() {
return this._http.get(`${this._originUrl}/api/events`)
.map((response: Response) => <IEvent[]>response.json())
.catch(this.handleError_);
}
handleError_(error: Response): Observable<string> {
return Observable.throw(error.statusText);
}
}
如果我颠倒 TS2322: Type 'Observable<string | IEvent[]>' is not assignable to type 'Observable<IEvent[]>'.
Type 'string | IEvent[]' is not assignable to type 'IEvent[]'.
Type 'string' is not assignable to type 'IEvent[]'.
和map
的顺序:
catch
或者,如果我删除了JSON响应的类型断言:
return this._http.get(`${this._originUrl}/api/events`)
.catch(this.handleError_)
.map((response: Response) => <IEvent[]>response.json());
一切似乎都运转良好。有人可以解释一下这里发生了什么,也许可以提供一些链接,以便我对此有更深入的了解吗?
提前致谢
答案 0 :(得分:2)
问题是您的handleError
方法被声明为返回Observable<string>
,因此getEvents
中有两条可能的路径:一条返回Observable<IEvent[]>
,另一条返回{ {1}}。
这就是你看到Observable<string>
的原因。
您的错误处理程序实际上并未返回该类型的observable;它返回一个始终重新抛出错误的observable,该错误的值是一个字符串。抛出不是Observable<string | IEvent[]>
实例的错误是否是一种良好的做法,这是值得怀疑的。我不认为是。
为Error
返回的observable指定的类型是指为handleError
通知发出的值的类型 - 而不是错误的类型。您可以解决将签名更改为:
next
或者:
handleError_(error: Response): Observable<IEvent[]> {
return Observable.throw(error.statusText);
}
我建议抛出handleError_(error: Response): Observable<any> {
return Observable.throw(error.statusText);
}
而不是字符串。
如果没有类型断言,则不会出现此问题,因为Error
的返回类型为json()
- 与any
兼容。