如何扩展rxjs以添加我自己的运算符?

时间:2016-11-07 17:37:39

标签: rxjs typescript2.0

我正在使用rxjs (5.0+),我希望为Operator撰写一个名为append的我自己的Observable。现在我已经成功创建了运算符并且它可以工作,但是如何告诉Typescript原始的Observable支持我的新运算符?因为它抱怨编译错误如下:

Property 'append' does not exist on type 'Observable'.

以下是我的源代码:

append.ts

Observable.prototype.append = function (value) {
    return new Observable((observer) => {
        const mapObserver = {
            next: (x) => observer.next(x == null ? value : x + value),
            error: (err) => observer.error(err),
            complete: () => observer.complete()
        };
        return this.subscribe(mapObserver);
    });
};

test.ts

import './append';

export class Test {
    init() {
        Observable.from([1, 2])
            .append('a') // <--- Compile error! but in fact, it works.
            .subscribe(function (x) {
                console.log(x); // Works, output 1a and 2a
            }
        );
    }
} 

我知道我需要告诉Typescript我的新Operator,但我不知道该怎么做?我检查了rxjs的源代码,发现它在src/add/operator/map.ts中包含以下代码。我尝试在我的append.ts中添加一些类似的代码,但我不知道包含Observable接口的模块名称是什么。 (顺便说一句,我使用的是Typescript 2。)

declare module '../../Observable' {
  interface Observable<T> {
    map: typeof map;
  }
}

1 个答案:

答案 0 :(得分:4)

声明合并中指定的模块名称应与导入Observable时使用的模块名称相同。例如:

import { Observable } from 'rxjs/Observable';

...

declare module 'rxjs/Observable' {
  interface Observable<T> {
    map: typeof map;
  }
}