2017-05-26 403 views
1

雖然我正在研究一些項目,但我遇到了這種類型的文章Subscriber<T>。我無法申報具有適當類型的財產。訂閱和訂閱者之間的差異<T> angular2

問題是,當我這樣做,

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類型。

那麼這兩者之間有什麼不同或相似之處呢?

+0

你有什麼進口? 'this._api.getDefaultMedia()。subscriptions.play'的類型是什麼?關於你最後的問題,這只是多態:訂閱者擴展了訂閱。租車時你不會感到驚訝,因爲福特是一輛汽車。同樣在這裏。 –

+0

'this._api.getDefaultMedia()。subscriptions.play'返回'Observable '。它是一個'videogular2'事件。 –

+0

什麼是您的進口? –

回答

1

有兩件事情是:

  1. 類型Subscription是不能分配給鍵入Subscription

    我敢打賭,你進口或宣佈一些其他Subscription類,現在打字稿試圖原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

作爲一個經驗法則,如果您不確定從函數返回了哪些情況下調用始終有一個看看.d.ts文件。這是RxJS自己的創造者推薦的。

subscribe()調用也不是唯一可以遇到的行爲。例如,所有window*()運營商都會發出Subject的實例,而不是Observable。這同樣適用於retryWhen()retryWhen()運營商。

前一段時間,我做了一個關於強制Observable s而不是Subject s的RxJS PR,因爲我在這裏總結的原因而關閉了。你可以在以下鏈接來看看他們,如果你有興趣瞭解更多深入的解釋:

+0

在我的代碼中,我正確地使用了訂閱。從「rxjs/Subscription」;'輸入{Subscription {}}。我正在訂閱的活動;可以在這裏找到https://github.com/videogular/videogular2/blob/master/src/core/vg-media/i-playable.ts和https://github.com/videogular/videogular2/blob/master/ src/core/vg-media/vg-media.ts –

+0

@AmitChigadani什麼行確切地拋出錯誤? – martin

+0

我已將代碼放入顯示錯誤的圖像中。同一條線。 –