2017-05-26 2 views
1

Während ich an einem Projekt arbeitete, stieß ich auf diesen Typ Subscriber<T>. Ich kann keine Eigenschaft mit dem entsprechenden Typ deklarieren.Diff zwischen Subscription und Subscriber <T> angular2

Problem ist, wenn ich es tue,

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

Er druckt mir die folgenden, die vom Typ Subscriber

enter image description here

ist, aber wenn ich versuche, eine Variable zuzuordnen, die vom Typ Subscription

Es gibt mir die folgende Fehlertyp Subscription nicht belegbar ist Subscription

enter image description here

Selbst zu geben, obwohl sagt sie es Subscription zurückkehrt, wenn ich sie trösten vom Typ Subscriber.

Was ist der Unterschied oder die Ähnlichkeit zwischen diesen beiden?

+0

Was sind Ihre Importe? Was ist der Typ von 'this._api.getDefaultMedia(). Subscriptions.play'? In Bezug auf deine letzte Frage, das ist nur Polymorphie: Abonnent verlängert Subscription. Sie sind nicht überrascht, einen Ford zu bekommen, wenn Sie ein Auto mieten, weil ein Ford ein Auto ist. Hier gilt das gleiche. –

+0

'this._api.getDefaultMedia(). Subscriptions.play' gibt 'Observable ' zurück. Es ist ein 'videogular2' Event. –

+0

Was sind Ihre Importe? –

Antwort

1

Es gibt zwei Dinge dazu:

  1. Typ Subscription nicht belegbar ist Subscription einzugeben.

    Ich wette, Sie importiert oder erklärten eine andere Subscription Klasse und jetzt versucht Typoskript das ursprüngliche Subscription Form rxjs Paket zu Ihrer benutzerdefinierten Subscription Klasse zuzuordnen. Deshalb beschwert es sich, dass _subscriptions Eigenschaft fehlt, die sonst nicht passieren kann.
    Siehe https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts#L45.

  2. Die subscribe() Methode gibt wirklich eine Instanz der Subscriber Klasse zurück.

    Allerdings Subscriber extends the Subscription class so sind die Typen korrekt. Wenn Sie TypeScript verwenden, können Sie mit dem Compiler keine schädlichen Inhalte erstellen, aber wenn Sie nur ES6 verwenden, können Sie dies ausnutzen. Ich hatte einen Kommentar zu einem der Probleme von RxJS in Bezug auf genau diese Situation: https://github.com/ReactiveX/rxjs/issues/2487#issuecomment-288976689.

Als Faustregel gilt, wenn Sie sich nicht sicher sind, welche Instanzen von der Funktion zurückgegeben werden, ruft immer einen Blick auf die .d.ts-Datei haben. Dies wird von den Erstellern von RxJS selbst empfohlen.

Der Anruf subscribe() ist auch nicht der einzige Ort, an dem Sie auf Verhalten stoßen können. Zum Beispiel senden alle window*() Operatoren eine Instanz von Subject anstelle von Observable. Gleiches gilt für die Operatoren retryWhen() und retryWhen().

Vor einiger Zeit machte ich einen PR zu RxJS bezüglich des Erzwingens Observable s statt Subject s und es wurde aus den Gründen geschlossen, die ich hier zusammenfasste. Sie können in den folgenden Links auf sie einen Blick haben, wenn Sie in vertiefende Erklärung interessiert sind:

+0

In meinem Code verwende ich das Subscription richtig. 'Importieren Sie {Subscription} von" rxjs/Subscription ";'. Das Ereignis, zu dem ich mich bewerbe; finden Sie hier https://github.com/videogular/videogular2/blob/master/src/core/vg-media/i-playable.ts und https://github.com/videogular/videogular2/blob/master/ src/core/vg-media/vg-media.ts –

+0

@AmitChigadani Welche Zeile genau wirft den Fehler? – martin

+0

Ich habe den Code in ein Bild, das Fehler zeigt. Die selbe Linie. –