首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误TS2355:声明类型既不是'void‘也不是'any’的函数必须返回一个值

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

Stack Overflow用户
提问于 2018-07-30 13:48:28
回答 2查看 15.4K关注 0票数 7

我使用角5中的auth保护来检查用户是否应该能够导航到特定的页面。我收到了一个与返回一个可观察到的错误有关的错误:

一个函数,其声明的类型既不是‘’也不是‘任意’,必须返回一个值.

这是我的authguard.ts

从‘@角/核心’导入{注入};从‘@ Router /路由器’导入{路由器、CanActivate、ActivatedRoute、ActivatedRouteSnapshot、RouterStateSnapshot };从CanActivate导入{ ApplicationVerificationService }

代码语言:javascript
复制
@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;
        }
      });   
  }; 
};

这是我的验证处

代码语言:javascript
复制
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,我认为我在返回时犯了一个错误,但我还有点挣扎。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-30 13:58:17

这将解决你的问题。

您的问题是您没有返回任何内容,并且订阅了您的HTTP调用。相反,返回可观察到的自身,并使用pipe(map(...))在HTTP调用之后执行操作,而不像subscribe那样中断操作链。

代码语言:javascript
复制
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;
    }
  }));   
}; 
票数 10
EN

Stack Overflow用户

发布于 2018-07-30 13:55:35

如果您查看CanActivate方法,它的返回类型是布尔型,应该是可观察的。此外,您也可以使用.map代替订阅,并在需要时返回可观察的内容。

希望这个能帮上忙。谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51595481

复制
相关文章

相似问题

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