【问题标题】:Type 'Observable<{}>' is not assignable to type 'Observable<boolean> | boolean '类型 'Observable<{}>' 不可分配给类型 'Observable<boolean> |布尔值'
【发布时间】:2016-11-12 23:02:56
【问题描述】:

我正在尝试关注this tutorial,但我遇到了错误。

  1. pathMatch:“满”。我尝试将“@angular/router”更改为“3.0.0-beta.2”,仍然是同样的问题。

我的依赖:

"dependencies": {
    "@angular/common": "2.0.0-rc.3",
    "@angular/compiler": "2.0.0-rc.3",
    "@angular/core": "2.0.0-rc.3",
    "@angular/http": "2.0.0-rc.3",
    "@angular/platform-browser": "2.0.0-rc.3",
    "@angular/platform-browser-dynamic": "2.0.0-rc.3",
    "@angular/platform-server": "2.0.0-rc.3",
    "@angular/router": "3.0.0-beta.2",
    "@angular/router-deprecated": "2.0.0-rc.2",
    "nativescript-angular": "0.2.0",
    "tns-core-modules": "^2.1.0"
},
  1. 类型 'Observable' 不可分配给类型 'Observable',它指向行 'return o';

    canDeactivate(): Observable<boolean> | boolean {
    
    if (!this.crisis || this.crisis.name === this.editName) {
    
    return true;
    }
    let p = this.dialogService.confirm('Discard changes?');
    let o = Observable.fromPromise(p);
    return o;
    }
    

谁能指导我修复这些错误?谢谢。

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    我遇到了同样的错误,问题是我没有将 Authguard 作为服务注入提供程序,而且我没有在 canActivated 中放入路由数组。确保您的 AuthGuard 为

    `@Injectable()
    export class AuthGuard implements CanActivate {
      logued: boolean = false;
    
      constructor(private rest: UsuarioService, private router: Router) {
        this.rest.getObservLogued().subscribe(res => {
          this.logued = res;
        });
      }
    
      canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean|UrlTree>|Promise<boolean|UrlTree>|boolean|UrlTree  {
        let url: string = state.url;
    
        return this.checkLogin(url);
      }`
    

    然后在您希望像这样设置 authguard 的路由中

    `{ path: 'articulos', component: ArticuloComponent,
    
       canActivate: [AuthGuard] },`
    

    然后检查您是否在 app.module 中作为服务 AuthGuard 注入

    providers : [AuthGuard]
    

    【讨论】:

      【解决方案2】:

      编译器抱怨因为返回值o 的类型是Observable&lt;{}&gt;。这很可能是因为您正在从p 构造一个Observable,它解析为类型Promise&lt;{}&gt;。仔细检查dialogService.confirm() 并确保它的返回值是Promise&lt;boolean&gt; 类型。

      如果这不起作用,您可以尝试像 @rinukkusu 建议的那样显式转换。

      【讨论】:

      • 非常感谢!你知道我该如何解决“pathMatch”错误吗,来自互联网的建议似乎不起作用。
      • @kenkulan 您收到的确切错误是什么,从哪里以及在什么情况下?
      【解决方案3】:

      您可以尝试投射:

      canDeactivate(): Observable<boolean> | boolean {
      
          if (!this.crisis || this.crisis.name === this.editName) {
      
              return true;
          }
          let p = this.dialogService.confirm('Discard changes?');
          let o = <Observable<boolean>>Observable.fromPromise(p);
          return o;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 2020-01-06
        • 2018-08-14
        • 2021-01-02
        相关资源
        最近更新 更多