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

时间:2018-02-06 15:18:22

标签: angular rxjs angular5 rxjs5 angular-http-interceptors

我有一个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:&gt;类型&#39;可观察&gt; |观察到的&#39;不能分配给&gt;类型&#39; Observable&gt;&#39;。    输入&#39; Observable&#39;不能分配给&gt;&#39; Observable&gt;&#39;。      输入&#39; string&#39;不能分配给&#39; HttpEvent&#39;。

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

此处的问题是of(cachedResponse)不是Observable<HttpEvent<any>>类型,而是Observable<string>

我尝试了很多方法,但我无法想到最适合的方法。是否有可能以任何方式将缓存数据转换为Observable<HttpEvent<any>>类型,或者可能有另一种好方法来修复它?我知道我可以为我的案例提供我自己的HttpInterceptor接口和正确的类型,甚至只是删除HttpInterface引用,但这些可能不是最好的解决方案,尤其是后者。任何人

1 个答案:

答案 0 :(得分:0)

如果您无法更改CacheService的输入,这就是您的问题,那么您可以使用类型断言:

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

请注意,类型断言修改数据;它只是告诉Typescript编译器你知道类型是你声称它的类型。

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

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

会奏效。从功能上讲,它完全相同并没有区别,但它取决于restore是否被正确输入。由于我不知道你的CacheService是什么,我不知道是否是这种情况。