首页 文章

错误TS2355:声明类型既不是'void'也不是'any'的函数必须返回一个值

提问于
浏览
-2

我正在角度5中使用auth guard来检查用户是否应该能够导航到特定页面 . 我收到一个与返回observable相关的错误:

A function whose declared type is neither 'void' nor 'any' must return a value.

这是我的authguard.ts

从'@ angular / core'导入;从'@ angular / router'导入{Router,CanActivate,ActivatedRoute,ActivatedRouteSnapshot,RouterStateSnapshot};从'../../service/application-verification.service'导入;

@Injectable() export class AppStatusGuard implements CanActivate {

  applicationId: number;   personId: number;

  constructor(
    public router: Router,
    public readonly activeRoute: ActivatedRoute,
    public readonly applicationVerificationService: ApplicationVerificationService) { }

  loginRoute: boolean;   memberRoute: boolean;


  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

    this.applicationId = Number(route.params["applicationId"]);
    this.personId = Number(route.params["personId"]);

    // Make sure they are allowed on this page, if not re-direct
    const url = this.applicationVerificationService.getRouteForFellowshipApplicant(this.personId, this.applicationId)
      .subscribe((res: string) => {
        console.log(url);

        if (res !== `application-status/${this.personId}/${this.applicationId}`) {
          console.log("failure");
          // this.router.navigateByUrl(url);
          return false;
        } else {
          console.log("success");
          //this.router.navigateByUrl(url);
          return true;
        }
      });   
  }; 
};

这是我的验证服务

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import 'rxjs/Rx';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class ApplicationVerificationService {
  constructor(
    private readonly httpClient: HttpClient,
    private readonly router: Router) { }

  getRouteForFellowshipApplicant(personId, applicationId): Observable<string> {
    this.httpClient.get('api/application-verification/' + personId).subscribe((responseObject: IFellowshipApplicationStatus) => {

      return Observable.create(observer => {

        if (responseObject.preApplicationVerificationStatus === 'GoToTrackerPage') {
          observer.next('application-status/' + personId + '/' + applicationId);
        }
        if (responseObject.preApplicationVerificationStatus === 'GoToApplicationFormPage') {
          observer.next('application-form/' + personId + '/' + applicationId);
        }
        if (responseObject.preApplicationVerificationStatus === 'GoToContactIceForInfoPage') {
          observer.next('contact-us/' + personId + '/' + applicationId);
        }
        if (responseObject.preApplicationVerificationStatus === 'GenericError') {
          observer.next('application-error/' + personId);
        }
        observer.complete();
      });
    });
    return null;
  }
}

我是rxjs的新手,我认为我在回复可观察性方面犯了一个错误,但我有点挣扎 . 任何帮助,将不胜感激 .

2 回答

  • 0

    这将解决您的问题 .

    您的问题是您没有返回任何内容,而您正在订阅您的HTTP呼叫 . 相反,返回Observable本身,并使用 pipe(map(...)) 在HTTP调用之后执行操作,而不会中断像 subscribe 这样的操作链 .

    return this.applicationVerificationService.getRouteForFellowshipApplicant(this.personId, this.applicationId)
      .pipe(map(res => {
        console.log(url);
    
        if (res !== `application-status/${this.personId}/${this.applicationId}`) {
          console.log("failure");
          // this.router.navigateByUrl(url);
          return false;
        } else {
          console.log("success");
          //this.router.navigateByUrl(url);
          return true;
        }
      }));   
    };
    
  • 2

    如果你看一下CanActivate方法,它的返回类型是boolean,它应该是Observable . 而且,如果需要,您可以使用.map并返回Observable而不是subscribe .

    希望这可以帮助 . 谢谢 .

相关问题