【问题标题】:Error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value错误 TS2355:声明类型既不是“void”也不是“any”的函数必须返回一个值
【发布时间】:2019-01-06 19:02:41
【问题描述】:

我正在使用 Angular 5 中的身份验证保护来检查用户是否应该能够导航到特定页面。我收到与返回 observable 相关的错误:

声明类型既不是“void”也不是“any”的函数必须返回一个值。

这是我的 authguard.ts

从 '@angular/core' 导入 { Injectable }; 从'@angular/router'导入{路由器,CanActivate,ActivatedRoute,ActivatedRouteSnapshot,RouterStateSnapshot}; 从 '../../service/application-verification.service' 导入 { ApplicationVerificationService };

@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 的新手,我认为我在返回 observable 的方式上犯了一个错误,但我有点挣扎。任何帮助将不胜感激。

【问题讨论】:

  • 两种方法都说它们应该返回一些东西。一个显式返回 null ,另一个根本不返回任何内容。 “我返回 observable 的方式出错了” - 与其说是错误,不如说是你实际上并没有这样做。

标签: angular typescript rxjs angular5 subscribe


【解决方案1】:

如果你看一下 CanActivate 方法,它的返回类型是布尔值,它应该是 Observable。 此外,如果需要,您可以使用 .map 并返回 Observable,而不是订阅。

希望,这会有所帮助。谢谢。

【讨论】:

  • 这应该是一条评论。如果您无法发表评论,请考虑做出实际回答。
【解决方案2】:

这将解决您的问题。

您的问题是您没有返回任何内容,而是订阅了您的 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;
    }
  }));   
}; 

【讨论】:

  • 感谢您的建议帮助。我没有意识到错误消息在堆栈中引用的是 authguard 代码。一旦我添加了对 getRouteForFellowshipApplicant 的返回调用并稍微重构了我的代码,它就开始按照我最初想要的方式工作。
猜你喜欢
  • 2018-03-18
  • 2018-03-09
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多