Angular2(Typescript)http包装器

时间:2016-08-19 07:07:52

标签: angular typescript rxjs angular2-observables

今天我在尝试实现抽象的http服务时遇到了以下问题。此服务应该是扩展所有其他http服务的基础。

到目前为止,实现方法正在遵循,其他方法也不再使用ilustration:

@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清楚地返回Item []并在映射从服务器返回的结果时使用。

我决定实现这个抽象的HttpWrapper“以保持干燥”。我不确定这是否是最佳方式。

1 个答案:

答案 0 :(得分:2)

此处的问题似乎是SELECT M2M.BranchID ,M2M.CostCodeID ,TM2M.TeamID ,CC.CostCode ,TM.TeamName FROM ((tbl_CostCodes CC INNER JOIN tbl_CostCodeM2MJoin M2M ON CC.ID = M2M.CostCodeID) LEFT JOIN tbl_CostCodeToTeamM2MJoin TM2M ON (M2M.BranchID = TM2M.BranchID AND M2M.CostCodeID = TM2M.CostCodeID)) LEFT JOIN tbl_Teams TM ON TM2M.TeamID = TM.ID 返回handleError(),因此不能是期望Observable<Reponse>

getAll()的返回值

将handleError的返回类型更改为Observable<T[]>可以解决问题。

Observable<T[]>

HttpWrapper

abstract handleError(error: any):Observable<T[]>

BlastReportService