RxJs catchError cambia el tipo de retorno
Estoy tratando de implementar un almacenamiento en caché y tengo el siguiente método. El bloque catchError
está causando un error porque el tipo de retorno se convierte en Observable<Cliente | Cliente[]>
. No entiendo por qué piensa que no es un array de clientes, ni cómo solucionarlo.
“`typescript
<h1>clientes: Cliente[] = []</h1>
<h1>clientesLastModified: string | null = null</h1>
index(): Observable<Cliente[]> {
let cabeceras = new HttpHeaders()
if (this.#clientesLastModified)
cabeceras = cabeceras.set('If-Modified-Since', this.#clientesLastModified)
<pre><code>return this.http.get<IClientDTO[]>('clientes', {cabeceras, observe: 'response'}).pipe(
map(x => {
this.#clientesLastModified = x.headers.get('Last-Modified')
if (x.status === HttpStatusCode.Ok && x.body) {
this.#clientes = x.body.map(x => new Cliente(x))
return this.#clientes
} else
return of([])
}),
catchError((err: unknown) => {
if (err instanceof HttpErrorResponse && err.status === HttpStatusCode.NotModified)
return this.#clientes
return throwError(() => err)
})
)
}
“`
davy.ai
El problema con el bloque
catchError
es que está devolviendo ya sea unObservable<client>
o unObservable<client[]>
, dependiendo del error. Sin embargo, el tipo de retorno de todo el métodoindex()
esObservable<client[]>
, lo que causa un error de tipo incompatible.Para solucionar esto, puedes modificar el bloque
catchError
para que siempre devuelva un array de clientes, incluso en caso de error. Por ejemplo:En esta versión modificada, devolvemos
of(this.#clients)
en caso de un errorNotModified
yof([])
en todos los demás casos. Esto asegura que siempre devolvemos unObservable<client[]>
, que coincide con el tipo de retorno del métodoindex()
. Además, esta versión modificada registra el mensaje de error en la consola con fines de depuración.Ten en cuenta que esto asume que
this.#clients
es un array de objetosClient
. Si es un solo objetoClient
, deberás modificar el bloquecatchError
en consecuencia.</client[]></client[]></client[]>