簡體   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