web-dev-qa-db-ja.com

catchError()を使用し、rxJs 6.0で型指定されたObservableを返すにはどうすればよいですか?

cdSo Angular 5コードを6に移行しようとしています。rxjsが.pipe()演算子を使用して動作するために必要な変更のほとんどを理解しています。 「pipable」操作を期待します。

ただし、catchError()の動作は.catch()演算子とは異なります。 rxjs 6より前は、.catch()演算子を使用して、エラー入力を一貫したエラーオブジェクトに変換し、 `.subscribe()でキャッチできます。

_getAlbums(): Observable<Album[]> {
     return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
           .map(albumList => this.albumList = albumList)
           .catch(new ErrorInfo().parseObservableResponseError);            
    }
_

new ErrorInfo().parseObservableResponseErrorは、入力としてエラーオブジェクトを受け取り、入力エラーを解析して、正規化されたオブジェクトを使用して単純なエラーオブジェクトに変換する関数です。キャッチは_Observable<any>_を返します:

_parseObservableResponseError(response): Observable<any> {
    let err = new ErrorInfo();
    ...
    return Observable.throw(err);        
}
_

これは、rxjs5でエラーを簡単に処理するのに最適です。エラーは、基本的にパイプラインの一部としてキャプチャされ、.subscribe()エラー関数をキャプチャできる既知のエラー構造をスローします。

ただし、同じコードをrxjs 6に移動し、.pipe()を使用して、次のことをしようとしています。

_getAlbums(): Observable<Album[]> {
    return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
                .pipe(
                    map(albumList => this.albumList = albumList),
                    catchError(new ErrorInfo().parseObservableResponseError)                        
                );           
}
_

ただし、catchErrorが_Observable<any>_の結果をパイプラインに返すため、これは機能しません。本質的には、以前のようにエラーを再スローするだけです。

エラーTS2322:「Observable <{} | Album []> 'は、タイプ' Observable 'に割り当てられません

古い演算子.catch() behaviorをどのようにシミュレートしますか?

更新:

これを少しいじってみたところ、示されているコードは、ビルドエラーを出さずに機能し始めたばかりです。正直なところ、以前はエラーメッセージで失敗した理由はわかりませんが、現在は機能しています。コメント内の@cartantによる提案は、結果を指定する明示的な方法であり、同様に機能します。

10
Rick Strahl

型パラメーターをcatchErrorに明示的に指定して、値を出力するオブザーバブルを返さないことを示すことができるはずです。つまり、Observable<never>を返し、常にスローします。

getAlbums(): Observable<Album[]> {
    return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
        .pipe(
            map(albumList => this.albumList = albumList),
            catchError<Album[], never>(new ErrorInfo().parseObservableResponseError)
        );           
}

そうすることで、pipe呼び出しから推測された型がObservable<Album[]>であることがわかります。

14
cartant