2016-08-11 10 views
4

私はtypescript angular 2 appを構築していて、rxjsを使っています。私はここでの例を以下しています:角度2 rxjs switchmapがObservableを返す<Object>

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

私は強くtypescriptですと私のリターン署名を入力しようとしていますすべてけれども。これは私の問題かもしれません。しかし、あなたができるはずのようです。

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>> 
     }); 
    } 

これはswitchmapではなく、私のタイプの観測を返している理由を私は理解していないメッセージCannot convert type Observable<Object> to type Observable<MyModel[]>>

でコンパイルされません。結果に与える前に再度マップする必要がありますか?これはswitchmapのリターンシグネチャのタイポスクリプトのタイプミスですか?あなたのハンドラに戻り値の型与える

+2

私はあなただけのキャストが必要だと思います。 – Andrew

+0

私はそれを試みましたが、キャストが所属するスイッチマップチェーンの終わりではなく、returnステートメントを無造作にキャストしました。それは欠場する骨が抜けたものでした。ありがとう! – twifosp

答えて

1

活字体は、私は次のいずれかをしようと、間違った型推論がある可能性があります

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

を、これは変更のために、「妥協」を動作しない場合結果変数のタイプは次のようになります。

results: Observable<any>; 
0

実際にエラーメッセージが表示されます。ただし、スタックトレースがないとエラーを引き起こした行は不明です。

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

をオペレータのこのチェーンは常にSubjectのジェネリックがSearchあるのでresultプロパティが(Observable<Array<MyModel>>を)期待していないObservableを返します:あなたが呼び出すngOnInit()方法で

演算子switchmap()は常にObservableを返します。その戻り値の型は呼び出し可能関数とは何の関係もありません。

あなたは、単に結果を型キャストすることによって、これを解決することができます:

this.results = Observable<MyModel[]>this.search 
    .debounceTime(..) 
    ... 
関連する問題