当我在处理某个项目时,我遇到了这种类型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
。
那么这两者之间有什么区别或相似之处?
答案 0 :(得分:1)
这有两件事:
类型Subscription
不能分配给Subscription
。
我打赌您导入或声明了其他Subscription
类,现在TypeScript尝试将原始的Subscription
表单rxjs
包分配给您的自定义Subscription
类。这就是为什么它抱怨_subscriptions
财产丢失,否则就不会发生这种情况
请参阅https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts#L45。
subscribe()
方法确实返回Subscriber
类的实例。
然而Subscriber
extends the Subscription
class所以类型是正确的。如果你正在使用TypeScript,编译器不会让你做任何恶意的东西,但如果你只使用ES6,你可以利用它。关于这种情况,我对RxJS的一个问题发表了评论:https://github.com/ReactiveX/rxjs/issues/2487#issuecomment-288976689。
根据经验,如果您不确定从函数调用返回的实例,请始终查看.d.ts
文件。这是由RxJS自己的创建者推荐的。
subscribe()
来电也不是您遇到行为的唯一地方。例如,所有window*()
运算符都会发出Subject
而不是Observable
的实例。这同样适用于retryWhen()
和retryWhen()
运营商。
前段时间我向RxJS提出了关于强制Observable
而不是Subject
s的PR,由于我在此总结的原因而关闭了它。如果您对更深入的解释感兴趣,可以在以下链接中查看它们: