angular - 错误 TS2322:类型 'Observable<{}>' 不可分配给类型 'Observable', 将角度从 6.2 更新到 7.2 后
问题描述
import { of as observableOf, Observable } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
import { Injectable, Injector } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateChild } from '@angular/router';
@Injectable()
export class MasterGuard implements CanActivate, CanActivateChild {
constructor(private readonly injector: Injector) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
if (next.data.guards.canActivate && next.data.guards.canActivate.length > 0) {
return this.executeGuardsCanActivate(next.data.guards.canActivate, next, state);
} else {
return true;
}
}
executeGuardsCanActivate(guards, next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
let start = observableOf(true);
guards.forEach(guard => {
start = start.pipe(
mergeMap(x => {
if (x) {
return this.injector.get(guard).canActivate(next, state);
} else {
return observableOf(false);
}
})
);
});
return start;
}
}
以上是从 6 到 7 的角度更新后编译时引发错误的代码。有什么帮助吗?
src/app/shared/guards/master.guard.ts(35,7) 中的错误:错误 TS2322:类型“Observable<{}>”不可分配给类型“Observable”。类型“{}”不可分配给类型“布尔”。src/app/shared/guards/master.guard.ts(52,7):错误 TS2322:类型 'Observable<{}>' 不可分配给类型 'Observable'。
路由代码
const routes: Routes = [
{
path: 'dashboard',
component: DashboardComponent,
canActivate: [MasterGuard],
data: {
guards: {
canActivate: [AuthGuard, UserInformationGuard]
}
}
},
解决方案
问题出在 function 内部executeGuardsCanActivate
,而这一行就是问题所在:
return this.injector.get(guard).canActivate(next, state);
请尝试以下方法:
return observableOf(this.injector.get(guard).canActivate(next, state));
这是 Angular 9 中的示例代码,但我相信它也应该适用于 Angular 7: https ://stackblitz.com/edit/angular-ivy-mn4h3p?file=src%2Fapp%2Fapp.service.ts
编辑
有效的新 stackblitz 链接:
https://stackblitz.com/edit/angular-ivy-mccbhk?file=src%2Fapp%2Fapp.service.ts
推荐阅读
- reactjs - 部署 React Web 应用微服务环境
- clojure - clojure 宏:无法解析符号
- bash - 如何从自定义 udev 规则运行具有正确权限的脚本?
- php - 将 MongoDB Aggregation $all (JS) 翻译成 Doctrine ODM Aggregation (PHP)
- java - 更改方法参考的类型
- html - 主元素不得作为节元素的后代出现
- c# - 如何在 c# WPF 中像 android 一样制作 CircularFloatingActionMenu?
- python - mac run deepfakes - faceswap ' faceswap.py' 出错
- certificate - 如何在提琴手请求或邮递员请求中添加 CA 证书?
- reactjs - 编译失败