Angular 如何使用catchError()并使用rxJs 6.0返回类型化的可观察对象?

Angular 如何使用catchError()并使用rxJs 6.0返回类型化的可观察对象?,angular,typescript,typescript-typings,rxjs6,Angular,Typescript,Typescript Typings,Rxjs6,因此,我正在尝试将一些Angular 5代码迁移到6,并且我了解使用.pipe()操作符运行rxjs所需的大部分更改。它的工作原理与您期望的“pipable”操作相同 但是,catchError()的行为不同于.catch()操作符。在rxjs 6之前,我使用.catch()操作符将错误输入转换为一致的错误对象,然后可以在“.subscribe()中捕获该对象 这对于在rxjs5上轻松处理错误非常有用-错误基本上是作为管道的一部分捕获的,然后抛出一个众所周知的错误结构,可以捕获.subscrib

因此,我正在尝试将一些Angular 5代码迁移到6,并且我了解使用.pipe()操作符运行rxjs所需的大部分更改。它的工作原理与您期望的“pipable”操作相同

但是,
catchError()
的行为不同于
.catch()
操作符。在rxjs 6之前,我使用
.catch()
操作符将错误输入转换为一致的错误对象,然后可以在“.subscribe()中捕获该对象

这对于在rxjs5上轻松处理错误非常有用-错误基本上是作为管道的一部分捕获的,然后抛出一个众所周知的错误结构,可以捕获
.subscribe()
error函数

但是,将相同的代码移动到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)                        
                );           
}
getAlbums():可观察{
返回此.httpClient.get(this.config.url.url(“相册”))
.烟斗(
映射(albumList=>this.albumList=albumList),
catchError(新的ErrorInfo().ParseObserverResponseError)
);           
}
但是,这不起作用,因为catchError现在将
Observable
的结果返回到管道中,这不是我想要的。本质上,我只是想像以前一样重新抛出任何错误

错误TS2322:类型“Observable”不可分配给类型“Observable”

如何模拟旧的操作符
.catch()
行为

更新:


在对这个问题进行了更多的研究之后,所示的代码刚刚开始工作,没有给我一个构建错误。老实说,我不知道为什么它失败的错误消息之前,但现在正在工作。@cartant在注释中的建议是一种明确的方法,可以指定结果,也可以使用。

您应该能够明确地将类型参数指定为
catchError
,以表明它不会返回发出值的可观察对象-也就是说,它将返回
可观察对象
-并且将始终抛出:

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)
        );           
}
getAlbums():可观察{
返回此.httpClient.get(this.config.url.url(“相册”))
.烟斗(
映射(albumList=>this.albumList=albumList),
catchError(新的ErrorInfo().ParseObserverResponseError)
);           
}

这样做将看到从
管道
调用推断出的类型是
可观察的

如果您只是抛出新的ErrorInfo()。ParseObserverResponseError(e)而不是返回它?为什么catchError((e:any)=>{return Observable.of({success:false,error:true}));?或者catchError((e:any)=>{return Observable.throw(e.error)})@Eliseo这有时会起作用,但主要的问题是你会得到一个返回类型,它是观察对象原始类型的并集(可能是HttpResponse)和这个'success/fail'结构。也就是说,如果你继续使用这个链,你将拥有
HttpResponse{success:boolean,error:any}
。然后需要在它之后添加一个额外的“映射”来规范化类型。我已经尝试过了,这是一个巨大的痛苦。catchError的要点是,如果没有错误,就不会调用它!
catchError
应该有一个重载签名,以便在传递的函数的返回类型为
never-即总是抛出。我想是时候创建另一个PR了。
getAlbums(): Observable<Album[]> {
    return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
                .pipe(
                    map(albumList => this.albumList = albumList),
                    catchError(new ErrorInfo().parseObservableResponseError)                        
                );           
}
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)
        );           
}