我在我的一個路由守護中這樣做......
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
// 依次通過每個檢查,如果有一個檢查出錯,就停止處理。
return of(true).pipe(//管道中的運算子有限制嗎?
switchMap(() => of(true)), //在這篇文章中被簡化了...通常呼叫一個函式來回傳
switchMap(() => of(true))。
switchMap(() => of(true))。
switchMap(() => of(true))。
switchMap(() => of(true))。
switchMap(() => of(true))。
switchMap(() => of(true))。
switchMap(() => of(true))。
// 如果任何函式回傳throwError,我們跳過其他檢查
catchError(() => of(false))
);
}
我遇到了一個錯誤。 如果還有一個switchMap添加到串列中,VSCode會告訴我 "'Observable<{}>'型別不能賦值給'Observable'型別。 型別'{}'不能分配給型別'boolean'.ts(2322)"
。誰能向我解釋一下為什么會出現這種情況? 我想不出來,也找不到相關的問題。
uj5u.com熱心網友回復:
這個問題在這個github問題中得到了相當好的解釋。
它的要點是只支持 9 個運算子 - 任何更多的運算子,它將退回到鍵入 Observable<{}>,因為他們必須手動鍵入所有 9 個運算子。
使用多個管道(在第 9 個條目之后保持型別安全)
如果你仍然想保持型別安全,但要添加超過9個運算子,只需再次呼叫管道函式。
source$
.pipe(
tap(() => {}) 。
tap(() => {}) 。
tap(() => {}) 。
tap(() => {}) 。
tap(() => {}) 。
tap(() => {}) 。
tap(() => {}) 。
tap(() => {}) 。
tap(() => {})
)
.pipe(
//在這里的第9個運算子之后添加下一個運算子。
tap(() =>/span> {})
)
手動斷言結果型別
另外,你可以在最后添加一個手動型別斷言。但是請注意。在第9個運算子之后,型別將被推斷為Observable<{}>,實際上失去了型別安全。
const source$:Observable<boolean> = of(true)
.pipe(
tap(() => {})。
tap(() => {})。
tap(() => {})。
tap(() => {}),
tap(() => {}),
tap(() => {}),
tap(() => {}),
tap(() => {}),
tap(() => {})。
// 這里失去了型別安全的意義
tap(() => {})。
tap(() => {}),
// 在結尾處手動斷言型別
// 注意,編譯器在這里會允許任何東西。
// 所以 "as Observable<string> "也可以,盡管它是錯誤的。
) as Observable<boolean>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323546.html
標籤:
