2016-12-22 92 views
1

最近我有一個需要一個函數中的觀察者參數,我正在我的桌子上敲我的頭,試圖找出如何在Typescript中做到這一點。您可能還記得在C#中使用了delegate參數;這基本上是我在這裏想要做的。這是subscribe(observer: Observer<any>)的一部分。我這樣做的原因是因爲我試圖爲訂閱添加AOP類型的書擋。這不是重要的部分。Angular 2&Typescript可觀察的函數參數 - Pipe做什麼?

基本上得到這個工作,你必須添加你的函數參數後面的|的性格,它最終是這樣的:

(observer: Observer<any>| ((value:any)=> void)): void

我的問題基本上是粗體部分在那個函數簽名中做了什麼?我搜遍了我能想到的所有資源,但無法弄清楚。如果沒有|後的部分,我得到這個錯誤:一旦我後面加上管道符和部分

Argument of type '(res: any) => void' is not assignable to parameter of type 'Observer'. Property 'next' is missing in type '(res: any) => void'.

,我能沒有問題訂閱傳統觀測方法(用箭頭的功能),以及我也確認所有的訂閱都可以工作(這將排除管道作爲默認值後的部分)。任何想法將不勝感激,因爲我討厭看到一些工作,但不知道爲什麼!

回答

3

它意味着observerObserver<any>類型的

|(

((value: any) => void):一個功能,其輸入是any值和輸出是void

+2

亦稱打字稿中的[union type](https://www.typescriptlang.org/docs/handbook/advanced-types.html) – Rob

+0

優秀!現在完全明顯。由於Angular 2,我一直在思考「管道」,而不是「OR」,這就是我爲什麼遇到問題的原因。非常感謝! –

+0

@CarlosMuentes哈哈,沒問題。很高興你知道了:) – echonax

3

爲@echonax說:這意味着OR將@Rob表示,其一個Union Type

,但我開始寫這個,我不覺得把它扔了:),只是因爲我慢。 :)

首先你限制上你的方法接受觀察員

class SubscribeMe<T> { 
    observable: Observable<T>; 
    susbscribe(observer: Observer<T>){ 
     return observable.susbscribe(observer); 
    } 
} 

那麼你試過像簽名 的行動採取行動時,就像

type Action = <T>(t:T)=> void  

做來調用它:

susbscribeMe = new SubscribeMe<any>(); 
    susbscribeMe.susbscribe((x)=> console.log(x)); 

與之前提供的簽名不匹配。

然後添加你喜歡的行動簽名的方法

class SubscribeMe<T> { 
    observabel: Observable<T> 
    susbscribe(observer: Observer<T>| (x)=> void){ 
     return observable.susbscribe(observer); 
    } 
}  

或...

class SubscribeMe<T> { 
    observabel: Observable<T> 
    susbscribe(observer: Observer<T>| Action<T>){ 
     return observable.susbscribe(observer); 
    } 
} 

與您告訴打字稿你可以叫我用行動或觀察員

......終於,這是所有更多鈔票becasue Rx.Observable接口(rxjs/Observable.d.ts)

定義一個重載的簽名「訂閱」像下面

* subscribe(): Subscription; 
* subscribe(observer: PartialObserver<T>): Subscription; 
* subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?:() => void): Subscription; 

這意味着你可以用

訂閱
  • 或動作
  • 或者觀察者
  • 或者空/沒有/納達

但總是會返回一個認購

例如:

import * as Rx from "rxjs"; 

export class SubscribeMe<T> { 

    private _events = new Rx.Subject<T>(); 

    /** 
    * Hide the source of the observable 
    * */ 
    get events(): Rx.Observable<T> { return this._events.asObservable(); } 

    /** 
    * Accept any signature accepted by Rx.Observabe INTERFACE (rxjs/Observable.d.ts) 
    * subscribe(): Subscription; 
    * subscribe(observer: PartialObserver<T>): Subscription; 
    * subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?:() => void): Subscription; 
    * 
    * as in OR Action<Ievent> Or Observer<Ievent> Or Null/Nothing/Nada 
    */ 
    subscribe = (observer?: (e:T) => void | Rx.Observer<T>) => { 
     return this.events.subscribe(observer); 
    } 
} 
+1

這是一個很好的答案 - 如果我可以接受,我會:) –

相關問題