'boolean | 类型的参数undefined' 不可分配给'boolean' 类型的参数

问题描述 投票:0回答:3

我尝试在 Angular 应用程序中插入身份验证系统。 (这个

完成一切后,我得到了这个代码:

private userCurrentState = new BehaviorSubject<boolean>(this.tokenAuthService.isSignedin());

此错误消息:

'boolean | 类型的参数undefined' 不可分配给'boolean' 类型的参数。

TokenAuthService
代码

getJwtToken() {
    return localStorage.getItem('auth_token');
}

validateToken() {
    const token = this.getJwtToken();
    if(token) {
        const payload = this.payload(token);
        if(payload) {
            return Object.values(this.tokenIssuer).indexOf(payload.iss) > -1 ? true : false;
        }
    }
    else {
       return false;
    }
}

isSignedin() {
    return this.validateToken();
}

我该如何修复?

angular typescript rxjs undefined
3个回答
0
投票

好吧,也许前面的答案可以完成这项工作,但他们没有解释为什么你的函数 validateToken 的返回值会导致未定义。

validateToken(){
  const token = this.getJwtToken();
  if(token){
    const payload = this.payload(token);
    if(payload){
      return Object.values(this.tokenIssuer).indexOf(payload.iss) > -1 ? true : false;
    }
    // You will get undefined here if payload is a falsy value
    // and thus you are getting <boolean|undefined> as result type.
    // One option is to provide else when !payload
  } else {
    return false;
  }
}

0
投票

调用

this.tokenAuthService.isSignedin()
可能会返回未定义的值,而BehaviorSubject 需要一个布尔值。

您可以通过使用布尔变量来解决此问题,并让该变量检查函数调用以将其自身设置为 true(如果为 true),或者如果为 false 或未定义则设置为 false。


0
投票

允许

BehaviourSubject
接受
undefined
数据类型。 改变

private userCurrentState = new BehaviorSubject<boolean>(this.tokenAuthService.isSignedin());

private userCurrentState = new BehaviorSubject<boolean | undefined>(this.tokenAuthService.isSignedin());

或者

由于您的

isSignedin
取决于
validateToken()
, 将其返回类型标记为
boolean

validateToken(): boolean{
     const token = this.getJwtToken();
     if(token){
       const payload = this.payload(token);
       if(payload){
         return Object.values(this.tokenIssuer).indexOf(payload.iss) > -1 ? true : false;
       }
       return false; // you can return false here
     } else {
        return false;
     }
  }
© www.soinside.com 2019 - 2024. All rights reserved.