首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >订阅与Subscriber<T> angular2的区别

订阅与Subscriber<T> angular2的区别
EN

Stack Overflow用户
提问于 2017-05-26 07:50:05
回答 1查看 1.2K关注 0票数 1

当我在做一些项目的时候,我遇到了这种类型的Subscriber<T>。我无法声明具有适当类型的财产。

问题是当我这么做的时候

代码语言:javascript
复制
let sub = this._api.getDefaultMedia().subscriptions.play.subscribe(
            () => {
                this.play();
            }
        );
console.log(sub);

它给我打印了以下Subscriber类型的

但是,如果我尝试赋值一个变量,它的类型是Subscription

代码语言:javascript
复制
private subPlay : Subscription;

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

它给出了以下错误类型:Subscription不能分配给Subscription类型

尽管它说它正在返回Subscription,但是当我做控制台时,它是Subscriber类型的。

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

EN

回答 1

Stack Overflow用户

发布于 2017-05-26 09:22:21

这有两件事:

  1. 类型Subscription不能分配给Subscription类型。 我敢打赌您导入或声明了其他一些Subscription类,现在TypeScript试图将原始的Subscription表单rxjs包分配给您的自定义Subscription类。这就是为什么它抱怨_subscriptions属性丢失,否则就不会发生这种情况。 见https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts#L45
  2. 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的公关,由于我在这里总结的原因,它被关闭了。如果您对更深入的解释感兴趣,可以在以下链接中查看它们:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44196352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档