打字稿& RxJS:利用RxJS类型而不捆绑相关的JS代码

时间:2017-11-26 12:22:16

标签: typescript npm webpack-2 rxjs5 umd

示例已简化,请查看full repository here。如果我忘记包含重要信息,请告诉我们:)

我正在开发一个打字稿的小包,它需要RxJS observable和一小部分运算符。此包的职责是为window.postMessage提供RxJS包装器API。该包公开了一个可以实例化的类:

export default class MyLib {
    public notifications$: Observable<any>;
    // ...
}

公共属性notifications$的原因是实现软件可以利用RxJS API来转换和检查此类中的数据(这是该程序包存在的关键原因)

我的软件包只依赖于Observable个实例运算符的一小部分(mapfiltertakepluck),和一个静态方法(fromEvent)。因此,使用size-sensitive import approach是有意义的,因为导入完整的RxJS运算符会为单类包创建一个巨大的包。

但是,采用这种方法也意味着公开的notifications$只实现导入的子集,我不希望客户端软件必须处理这些限制。

我接下来的想法是要求客户端在创建RxPostmessenger.useObservable(someReference)的实例之前调用MyLib行的内容,以委托控制Rx函数的子集以在最终中捆绑申请给客户。一个简化的例子:

mylib.ts

export default class RxPostmessenger {

    protected static Observable;

    static useObservable(someReference) {
        this.Observable = someReference;
    }

    public notifications$: Observable<any>;

    constructor(protected window: Window) {
        if (! MyLib.Observable) throw Error('Specify Rx Observable reference first.');
        this.notifications$ = MyLib.Observable.fromEvent(window, 'message');
    }
}

client.js / client.ts

// Import custom RxJS set:
import { Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';

// Import the package:
import RxPostmessenger from 'rx-postmessenger';

RxPostmessenger.useObservable(Observable);

// Then, safe to create some instances:
const window = document.getElementById('some-element').contentWindow;
const myLibInstance = new RxPostmessenger(window);

我一直在努力实现这种模式一天,但是打字稿编译器一直对我因为破坏它的日子感到愤怒。我似乎无法使用'rxjs'包中提供的类型定义,而无需导入实际的包,例如:import { Observable } from 'rxjs/Rx'或导入的一系列变体。

在这方面,我可能会非常误解一些打字稿的机制,但网上的信息量让我感到困惑,无法帮助我解决问题。 < / p>

我尝试添加像/// <reference path="../node_modules/rxjs/Rx.d.ts" />这样的参考路径线,并且大量的&#34;包括&#34;,&#34;排除&#34;,&#34;路径&#34 ; tsconfig.json中基于文档和github问题的设置。到目前为止一切都没有运气TSC一直告诉我它TS2304: Cannot find name 'Observable'。现在我有以下问题:

  • 这种模式是否可以实现,同时保持类型完整性
  • 如何在不导入&#39; rxjs的情况下获取Observable类型的类型完成情况。模块?
  • 如何输入(如果可能的话)Observable&#39;静态&#39; (构造函数)MyLib.useObservable()

0 个答案:

没有答案