[英]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.