示例已简化,请查看full repository here。如果我忘记包含重要信息,请告诉我们:)
我正在开发一个打字稿的小包,它需要RxJS observable和一小部分运算符。此包的职责是为window.postMessage提供RxJS包装器API。该包公开了一个可以实例化的类:
export default class MyLib {
public notifications$: Observable<any>;
// ...
}
公共属性notifications$
的原因是实现软件可以利用RxJS API来转换和检查此类中的数据(这是该程序包存在的关键原因)
我的软件包只依赖于Observable
个实例运算符的一小部分(map
,filter
,take
,pluck
),和一个静态方法(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'
。现在我有以下问题:
MyLib.useObservable()
?