Angular2(Typescript) http wrapper 的 RxJS observables 和通用类型
RxJS observables and generic types for Angular2(Typescript) http wrapper
今天我在尝试实现一个抽象的http服务时遇到了如下问题。此服务应该是扩展所有其他 http 服务的基础。
到目前为止执行如下,跳过其他方法进行说明:
@Injectable()
export abstract class HttpWrapper<T> {
private options: RequestOptions;
constructor(private http: Http, private endpointUrl: string) {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
this.options = new RequestOptions({ headers: headers });
}
public getAll(): Observable<T[]>{
return this.http.get(this.endpointUrl, this.options)
.map(this.extractAll)
.catch(this.handleError);
}
abstract handleError(error: any):Observable<Response>;
abstract extractOne(res: Response):T;
abstract extractAll(res: Response):T[];
}
现在,如果我想使用抽象的 HttpWrapper,我将执行以下操作:
@Injectable()
export class BlastReportService extends HttpWrapper<Item> {
constructor(http: Http) {
super(http,'/api/items');
}
handleError(error: any):Observable<Response>{
//Handling error
return Observable.throw(error);
}
extractAll(res: Response):Item[]{
let body = res.json();
let formatedBody = body.map((item: Item) => {
item = new Item(item);
return blastReport;
});
return formatedBody || [{}];
}
}
但是这样做我得到以下编译错误:
Type 'Observable<Response>' is not assignable to type 'Observable<T[]>'.
Type 'Response' is not assignable to type 'T[]'.
Property 'find' is missing in type 'Response'.
我无法解决这个问题,因为方法 extractAll 清楚地 returns Item[] 并且在映射从服务器返回的结果时使用。
我决定实现这个抽象的 HttpWrapper "to stay DRY"。我不确定这是否是最好的方法。
这里的问题似乎是 handleError()
return 是一个 Observable<Reponse>
,因此不能是 getAll()
的 return 值一个 Observable<T[]>
将 handleError 的 return 类型更改为 Observable<T[]>
应该可以解决问题。
在HttpWrapper
abstract handleError(error: any):Observable<T[]>
在BlastReportService
handleError(error: any): Observable<T[]> {
return Observable.throw(error)
}
今天我在尝试实现一个抽象的http服务时遇到了如下问题。此服务应该是扩展所有其他 http 服务的基础。
到目前为止执行如下,跳过其他方法进行说明:
@Injectable()
export abstract class HttpWrapper<T> {
private options: RequestOptions;
constructor(private http: Http, private endpointUrl: string) {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
this.options = new RequestOptions({ headers: headers });
}
public getAll(): Observable<T[]>{
return this.http.get(this.endpointUrl, this.options)
.map(this.extractAll)
.catch(this.handleError);
}
abstract handleError(error: any):Observable<Response>;
abstract extractOne(res: Response):T;
abstract extractAll(res: Response):T[];
}
现在,如果我想使用抽象的 HttpWrapper,我将执行以下操作:
@Injectable()
export class BlastReportService extends HttpWrapper<Item> {
constructor(http: Http) {
super(http,'/api/items');
}
handleError(error: any):Observable<Response>{
//Handling error
return Observable.throw(error);
}
extractAll(res: Response):Item[]{
let body = res.json();
let formatedBody = body.map((item: Item) => {
item = new Item(item);
return blastReport;
});
return formatedBody || [{}];
}
}
但是这样做我得到以下编译错误:
Type 'Observable<Response>' is not assignable to type 'Observable<T[]>'.
Type 'Response' is not assignable to type 'T[]'.
Property 'find' is missing in type 'Response'.
我无法解决这个问题,因为方法 extractAll 清楚地 returns Item[] 并且在映射从服务器返回的结果时使用。
我决定实现这个抽象的 HttpWrapper "to stay DRY"。我不确定这是否是最好的方法。
这里的问题似乎是 handleError()
return 是一个 Observable<Reponse>
,因此不能是 getAll()
的 return 值一个 Observable<T[]>
将 handleError 的 return 类型更改为 Observable<T[]>
应该可以解决问题。
在HttpWrapper
abstract handleError(error: any):Observable<T[]>
在BlastReportService
handleError(error: any): Observable<T[]> {
return Observable.throw(error)
}