2016-08-11 87 views
4

我正在構建打字稿角度2應用程序並使用rxjs。我在這裏繼例如:Angular 2 rxjs switchmap returns Observable <Object>

https://angular.io/docs/ts/latest/tutorial/toh-pt6.html#!#stq=formgroup&stp=1

全部雖然我試圖以打字稿強類型我返回簽名。這可能是我的問題,因爲你不應該這樣做。但似乎你應該能夠。

假設我有鍵入的服務返回一個Observable>。

public search(term: string) : Observable<Array<MyModel>> { // http call } 

在我的組件中,我試圖聽這個可觀察的流並返回結果。

private search = new Subject<Search>(); 
results: Observable<Array<MyModel>>; 

ngOnInit() { 
    this.results = this.search 
     .debounceTime(400) 
     .distinctUntilChanged() 
     .switchMap(search => { 
      return service.search(search.term); // returns Observable<Array<MyModel>> 
     }); 
    } 

這並不與消息Cannot convert type Observable<Object> to type Observable<MyModel[]>>

我不明白爲什麼switchmap正在恢復,而不是我喜歡的類型可觀察到的編譯。在給出結果之前,我是否需要重新映射它?這是與switchmap的返回簽名的打字稿類型問題?

+2

我認爲你需要的只是一個演員。 – Andrew

+0

我曾嘗試過,但無意中鑄造了返回語句,而不是在屬於演員的switchmap鏈的末尾。這是一個頭腦不清的問題。謝謝! – twifosp

回答

1

打字稿可能有錯誤的類型推斷,我會嘗試以下操作之一:

給你的處理程序返回類型:

.switchMap((search): Observable<Array<MyModel>> => { 
     return service.search(search.term); // returns Observable<Array<MyModel>> 
    }); 

,如果這也不行,「妥協」改變結果變量的類型爲:

results: Observable<any>; 
0

錯誤消息其實是對的。但是,如果沒有堆棧跟蹤,哪條線路導致錯誤還不清楚。

ngOnInit()方法調用:

this.results = this.search 
    .debounceTime(..) 
    ... 

運營商這條鏈總是返回Observable這是不一樣的result屬性需要(Observable<Array<MyModel>>),因爲Subject的一般是Search

運營商switchmap()總是返回Observable。它的返回類型與可調用函數無關。

您應該能夠通過簡單的類型轉換的結果來解決這個問題:

this.results = Observable<MyModel[]>this.search 
    .debounceTime(..) 
    ...