【问题标题】:Exporting a custom RxJS operator in an Angular library在 Angular 库中导出自定义 RxJS 运算符
【发布时间】:2017-03-08 14:21:21
【问题描述】:

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

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) {
          observer.next(x);
        }
      },
      error: (err) => observer.error(err),
      complete: () => observer.complete()
    };
    return this.subscribe(obs);
  });
};

这很好用。但是,我想将此声明提取到负责外部通信的库中。这个库的主要导入是一个单例服务。

如何从该库中正确导出原型扩展和模块声明?

【问题讨论】:

  • 不清楚操作符是已经被库使用了还是只是为了方便而存在。
  • 库本身对操作员没有内部使用,它是为导入库的用户提供的便利功能。
  • 然后按照 RxJS 使用rxjs/add/operator/... 的方式,在包根中提供restrictToCommandOperator.js
  • 谢谢,这看起来是一个有效的路径。如果您要使用代码示例来制定答案(为了完整起见),我可能会接受它;)

标签: angular typescript rxjs


【解决方案1】:

如果操作符不被库本身使用,并且为了用户方便而存在,它可以遵循RxJS的方式rxjs/add/operator/...

操作符定义可以移动到包根目录(restrictToCommandOperator.jsrestrictToCommandOperator.d.ts)中的单独文件并像这样导入

import 'packagename/restrictToCommandOperator';

需要注意的是,只有当包没有rxjs依赖和版本限制时,这才会顺利进行。如果是这样,则每个用户的项目可能有多个 RxJS 包版本,并且restrictToCommandOperator 不会扩展所需的Observable

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多