订阅和订阅者之间的差异<t> angular2

时间:2017-05-26 07:50:05

标签: angular rxjs subscription rxjs5 angular2-observables

当我在处理某个项目时,我遇到了这种类型Subscriber<T>。我无法声明具有适当类型的属性。

问题就在于我,

let sub = this._api.getDefaultMedia().subscriptions.play.subscribe(
            () => {
                this.play();
            }
        );
console.log(sub);

它打印出以下Subscriber

类型的内容

enter image description here

但是如果我尝试分配一个Subscription

类型的变量
private subPlay : Subscription;

 this.subPlay = this._api.getDefaultMedia().subscriptions.play.subscribe(
            () => {
                this.play();
            }
        );

它给我以下错误类型Subscription不能分配给Subscription

类型

enter image description here

即使它说它正在返回Subscription,但当我进行控制时,它的类型为Subscriber

那么这两者之间有什么区别或相似之处?

1 个答案:

答案 0 :(得分:1)

这有两件事:

  1. 类型Subscription不能分配给Subscription

    我打赌您导入或声明了其他Subscription类,现在TypeScript尝试将原始的Subscription表单rxjs包分配给您的自定义Subscription类。这就是为什么它抱怨_subscriptions财产丢失,否则就不会发生这种情况 请参阅https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts#L45

  2. subscribe()方法确实返回Subscriber类的实例。

    然而Subscriber extends the Subscription class所以类型是正确的。如果你正在使用TypeScript,编译器不会让你做任何恶意的东西,但如果你只使用ES6,你可以利用它。关于这种情况,我对RxJS的一个问题发表了评论:https://github.com/ReactiveX/rxjs/issues/2487#issuecomment-288976689

  3. 根据经验,如果您不确定从函数调用返回的实例,请始终查看.d.ts文件。这是由RxJS自己的创建者推荐的。

    subscribe()来电也不是您遇到行为的唯一地方。例如,所有window*()运算符都会发出Subject而不是Observable的实例。这同样适用于retryWhen()retryWhen()运营商。

    前段时间我向RxJS提出了关于强制Observable而不是Subject s的PR,由于我在此总结的原因而关闭了它。如果您对更深入的解释感兴趣,可以在以下链接中查看它们: