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

Argument of type 'boolean | undefined' is not assignable to parameter of type 'boolean'

我试图在 Angular 应用程序中插入一个身份验证系统。 (This one.

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

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

这个错误信息

Argument of type 'boolean | undefined' is not assignable to parameter of type '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();
}

我不知道为什么。有人在这里帮忙吗?非常感谢:)

调用 this.tokenAuthService.isSignedin() 可能 return 未定义,而 BehaviorSubject 需要一个布尔值。

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

允许BehaviourSubject接受undefined数据类型 变化

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

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

由于您的 isSignedin 取决于 validateToken(), 将其标记为 return 输入 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;
     }
  }

好的,也许以上答案可以解决问题,但它们没有解释为什么您的函数 validateToken 的 return 值结果为未定义。

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;
  }
}