以下自定义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[]) { ... }
我错过了什么?
答案 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
简化了事情。