首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度上的错误:输入'boolean Observable<boolean>‘不能指定键入'boolean’

角度上的错误:输入'boolean Observable<boolean>‘不能指定键入'boolean’
EN

Stack Overflow用户
提问于 2021-12-31 05:10:33
回答 2查看 738关注 0票数 0

查看答案以了解该方法。我使用相同的解决方案来实现主保护,因为我有多个守护程序,并且希望按顺序执行它们。

主护卫中的 -

代码语言:javascript
复制
return guard.canActivate(this.route, this.state);

整个职能规定如下:

代码语言:javascript
复制
//Create an instance of the guard and fire canActivate method returning a promise
    private activateGuard(guardKey: string): Promise<boolean> {

        let guard: Guard1 | Guard2 | Guard3 | Guard4;

        switch (guardKey) {
            case GUARDS.GUARD1:
                guard = new Guard1();
                break;
            case GUARDS.GUARD2:
                guard = new Guard2();
                break;
            case GUARDS.GUARD3:
                guard = new Guard3();
                break;
            case GUARDS.GUARD4:
                guard = new Guard4(this._Guard4DependencyService);
                break;
            default:
                break;
        }
        return guard.canActivate(this.route, this.state);
    }

我得到了下面提到的错误:

代码语言:javascript
复制
Type 'boolean | Observable<boolean>' is not assignable to type 'boolean'.
  Type 'Observable<boolean>' is not assignable to type 'boolean'.

请查找相同的stackblitz链接

截图分享如下:

请分享您的解决方案,以消除此错误。任何帮助都是非常感谢的,提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-31 07:34:15

我现在看到你的问题了。guard1服务和guard2服务有两种不同的返回类型。根据Promise<boolean>服务代码,需要将这两种返回类型作为MasterGuard类型。

如果您在activateGuard服务中看到了MasterGuard (),那么它就是对Promise<boolean>的期望。但是,在guard1服务中,您已经返回了Observable<boolean>

guard1.service.ts

代码语言:javascript
复制
@Injectable()
export class Guard1 implements CanActivate, CanActivateChild {
  
  constructor(private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    console.log('Chain-1');
    return Promise.resolve(true)   // Modified this part
  }

  canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return this.canActivate(route, state);
  }
}

guard2.service.ts

代码语言:javascript
复制
@Injectable()
export class Guard2 implements CanActivate, CanActivateChild {
  
  constructor() {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    console.log('Chain-2');
    return Promise.resolve(true);
  }

  canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return this.canActivate(route, state);
  }
}

工作代码:https://stackblitz.com/edit/angular-route-guards-9tzxmv

问题是因为这句话:

代码语言:javascript
复制
switch (guardKey) {
  case GUARDS.GUARD1:
    guard = new Guard1(this._Router);   // because of this line it was creating issue
    break;
  case GUARDS.GUARD2:
    guard = new Guard2();
    break;
  default:
    break;
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-31 07:34:34

根据共享的stackblitz代码,guard被定义为:

代码语言:javascript
复制
    let guard: Guard1 | Guard2;

因此,保护可以是Guard1Guard2类型之一,而且每个类都有不同的canActivate方法返回类型。一个是返回类型Observable<boolean>,另一个是Promise<boolean>

return guard.canActivate(this.route, this.state);语句可以返回Observable<boolean>Promise<boolean>,而包含返回语句的函数被定义为返回Promise<boolean>

您真的需要canActivate方法的Guard1Guard2类有不同的返回类型吗?如果您可以保持返回类型保持一致,那么应该可以解决这个问题。

如果您的需求仍然具有不同的返回类型,那么在将保护分配给Guard2实例时,返回语句应该如下:

代码语言:javascript
复制
    return guard.canActivate(this.route, this.state).toPromise();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70539200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档