繁体   English   中英

RXJS Observable.of()作为Observable <HttpEvent<any> &gt;在HttpInterceptor中

[英]RXJS Observable.of() as a Observable<HttpEvent<any>> in HttpInterceptor

我有一个Angular的HttpInterceptor看起来像这样:

(...)

export class CacheInterceptor implements HttpInterceptor {

  constructor(private cache: CacheService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

   const cachedResponse = this.cache.restore(req); // Object with cached data

   return cachedResponse ?
     of(cachedResponse): this.sendRequest(req, next);

(...)
}

一般来说,它似乎最后可以工作,但是Angular的编译器抱怨显示出类型不匹配的错误:

cache.interceptor.ts(27,5)中的错误:错误TS2322:>键入“可观察的”> | “可观察”不能分配给>“可观察>”类型。 类型“可观察”不能分配给类型>“可观察>”。 类型“ string”不可分配给类型“ HttpEvent”。

在Angular Docs中几乎可以找到相同的示例。

这里的问题是of(cachedResponse)不是Observable<HttpEvent<any>>而是Observable<string>

我尝试了很多方法,但我想不出什么是最好的解决方案。 是否有可能以任何方式将缓存的数据转换为Observable<HttpEvent<any>>类型,或者可能还有另一种好的方法来对其进行修复? 我知道我可以为我的情况提供适合自己的HttpInterceptor接口,甚至可以简单地删除HttpInterface引用,但是这些可能不是最佳解决方案,尤其是后者。 有人吗

如果您不能更改CacheService的类型,这对您来说是我的问题,那么您可以使用类型断言:

const cachedResponse = this.cache.restore(req) as HttpEvent<any>;

需要注意的是一个类型的断言修改数据; 它只是告诉Typescript编译器您知道类型就是您声明的类型。

但是,理想情况下, CacheService#restore是通用定义的,在这种情况下

const cachedResponse = this.cache.restore<HttpEvent<any>>(req);

会工作。 从功能上讲,它是完全相同的,没有任何区别,但它取决于要正确键入的restore 由于我不知道您使用的CacheService是什么,所以我不知道情况是否如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM