【问题标题】:RxJS observables and generic types for Angular2(Typescript) http wrapperAngular2(Typescript) http 包装器的 RxJS 可观察对象和泛型类型
【发布时间】:2016-12-26 06:15:02
【问题描述】:

今天我在尝试实现一个抽象的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 清楚地返回 Item[] 并在映射从服务器返回的结果时使用。

我决定实现这个抽象的 HttpWrapper “保持 DRY”。我不确定这是否是最好的方法。

【问题讨论】:

  • extractAll 返回 Item[],但您的类应该是 HttpWrapper。所以它应该返回一个 BlastReport[]。还不清楚此错误消息来自何处。请发布完整和准确的错误。
  • 另外,你的方法应该返回一个 Observable,但是 handleError 返回一个 Observable
  • 对那个 blastReport 感到抱歉,这不应该是问题所在。编辑那个。

标签: angular typescript rxjs angular2-observables


【解决方案1】:

看起来这里的问题是handleError() 返回一个Observable&lt;Reponse&gt;,因此不能是getAll() 的返回值,它需要一个Observable&lt;T[]&gt;

将handleError 的返回类型更改为Observable&lt;T[]&gt; 应该可以解决问题。

HttpWrapper

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

BlastReportService

handleError(error: any): Observable<T[]> {
  return Observable.throw(error)
}

【讨论】:

  • 您好 Philippe Plantier,问题出在 handleError 返回值中。非常感谢。
  • 老实说,我为发布这样一个愚蠢的问题而感到羞愧。
  • T 没有在 Angular 服务中重新配置你有什么想法吗
  • 您应该为此问题创建一个新问题,然后发布您的代码。但作为一种猜测,我会说你的服务不是通用的? typescriptlang.org/docs/handbook/generics.html#generic-classes
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多