当我在做一些项目的时候,我遇到了这种类型的Subscriber<T>。我无法声明具有适当类型的财产。
问题是当我这么做的时候
let sub = this._api.getDefaultMedia().subscriptions.play.subscribe(
() => {
this.play();
}
);
console.log(sub);它给我打印了以下Subscriber类型的

但是,如果我尝试赋值一个变量,它的类型是Subscription
private subPlay : Subscription;
this.subPlay = this._api.getDefaultMedia().subscriptions.play.subscribe(
() => {
this.play();
}
);它给出了以下错误类型:Subscription不能分配给Subscription类型

尽管它说它正在返回Subscription,但是当我做控制台时,它是Subscriber类型的。
那么这两者之间有什么区别或相似之处呢?
发布于 2017-05-26 09:22:21
这有两件事:
Subscription不能分配给Subscription类型。
我敢打赌您导入或声明了其他一些Subscription类,现在TypeScript试图将原始的Subscription表单rxjs包分配给您的自定义Subscription类。这就是为什么它抱怨_subscriptions属性丢失,否则就不会发生这种情况。
见https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts#L45。subscribe()方法实际上返回Subscriber类的一个实例。
但是, class,所以类型是正确的。如果您使用的是TypeScript,编译器不会让您做任何恶意的事情,但是如果您只使用ES6,您可以利用这个漏洞。我对RxJS关于这种情况的一个问题发表了评论:https://github.com/ReactiveX/rxjs/issues/2487#issuecomment-288976689。根据经验,如果您不确定函数调用返回了哪些实例,请始终查看.d.ts文件。这是RxJS的创建者自己推荐的。
subscribe()调用也不是唯一可以遇到行为的地方。例如,所有window*()操作符都发出一个Subject实例,而不是Observable实例。retryWhen()和retryWhen()运算符也是如此。
不久前,我向RxJS做了一个关于强迫Observables而不是Subjects的公关,由于我在这里总结的原因,它被关闭了。如果您对更深入的解释感兴趣,可以在以下链接中查看它们:
https://stackoverflow.com/questions/44196352
复制相似问题