在Typescript中指定自定义RxJS运算符的签名

时间:2017-03-08 14:42:03

标签: angular typescript rxjs

以下自定义RxJS运算符(实际上只是演示文件的.filter等效项)当前在Angular 4.0.0-rc.2组件中声明。

C

函数签名目前接受declare module 'rxjs/Observable' { interface Observable<T> { restrictToCommand<U>(f: (x: T) => U): Observable<U>; } } Observable.prototype.restrictToCommand = function (cmd) { return new Observable((observer) => { const obs = { next: (x) => { if (x.command === cmd || cmd.indexOf(x.command) !== -1) { observer.next(x); } }, error: (err) => observer.error(err), complete: () => observer.complete() }; return this.subscribe(obs); }); }; 作为隐式cmd类型。我试图限制允许的类型,如下所示:

any

restrictToCommand<U>(f: (x: T | T[]) => U): Observable<U>;

但是,似乎我无法覆盖提供的类型定义,因为这会导致以下编译器错误:

Observable.prototype.restrictToCommand = function (cmd: string | string[]) { ... }

我错过了什么?

1 个答案:

答案 0 :(得分:6)

当我定义自定义RxJS运算符时,我通常会这样做:

import { Observable } from 'rxjs/Observable';

function restrictToCommand<T>(
  this: Observable<T>,
  cmd: string | string[]
): Observable<T> {

  return new Observable((observer) => {
    const obs = {
      next: (x) => {
        if (x.command === cmd || cmd.indexOf(x.command) !== -1) {
          observer.next(x);
        }
      },
      error: (err) => observer.error(err),
      complete: () => observer.complete()
    };
    return this.subscribe(obs);
  });
}

Observable.prototype.restrictToCommand = restrictToCommand;

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

我发现在声明合并中使用typeof简化了事情。