使用泛型obeservable作为返回类型的扩展方法

时间:2016-05-17 11:50:26

标签: rxjs5 typescript1.8 angular2-testing

rxjs:5.0.0-beta.2 打字稿:1.8 Angular2:beta-9

我正在尝试模拟一个http服务类,但在扩展类时会遇到问题,如角度2文档中所述。

好像你不能覆盖一个返回一个类型化的observable的方法?我错过了什么?

import {Observable} from "rxjs/Observable";
import {IQuery} from "../Query";
import {Http} from "angular2/http";

export interface IQuery<TResult> {        
}

export class A {
    public test = <T>(q: IQuery<T>): Observable<T> => {
        var queryName = this.getName(query);
        var url = `api/query/${queryName}`;
        return this.httpPost<TResult>(url, query);
    };
}

export class AMock extends A {
    public test = <T>(q: IQuery<T>): Observable<T> => {
        return mockObservable;
    };
}

Severity    Code    Description Project File    Line    Suppression State
Error   TS2415  Class 'AMock' incorrectly extends base class 'A'.
  Types of property 'test' are incompatible.
    Type '<T>(q: IQuery<T>) => Observable<T>' is not assignable to type '<T>(q: IQuery<T>) => Observable<T>'.
      Type 'Observable<any>' is not assignable to type 'Observable<any>'.
        Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.    TypeScript Virtual Projects

如果返回类型为T但不是observable<T>,则工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为问题出在您指出的代码中。也许在实际代码中的导入或其他东西。

以下代码在typeScript ^ 1.8.10中编译良好:

import {Observable} from "rxjs/Observable";

export interface IQuery<TResult> {        
}

export class A {
    public test = <T>(q: IQuery<T>): Observable<T> => {
        return null;
    };
}

export class AMock extends A {
    public test = <T>(q: IQuery<T>): Observable<T> => {
        return null;
    };
}

我可以使用最新的Angular2快速启动插件编译它(Quick Start Docs中的第一个插件链接)。

检查以下app/main.ts文件:

http://plnkr.co/edit/cedJly52HvfIoS2fpzkY?p=preview

(注意:当编译失败时,输出将永远保持在“正在加载...”,这样就可以验证它是如何编译的了)