属性 'subscribe' 在类型 'void | Observable<User>' 上不存在。 TS(2339)

Property 'subscribe' does not exist on type 'void | Observable<User>'. ts(2339)

login() {
    this.auth.login(this.userName, this.password).subscribe((_: any) => {
      this.router.navigateByUrl('app', {replaceUrl: true});
    });
  }

我不知道为什么会出现此错误,尝试了一些方法但没有任何效果。

这是我的 auth.login 方法 - 不知道错误可能出在哪里 - 我是 Angular:

的新手
login(username: string, password: string) {
  let userObject: User;
    if (username === 'user' && password === 'user1234') {
      userObject = {
        name: 'Max Mustermann',
        userRole: 'USER',
      };
    }
    else if (username === 'admin' && password === 'admin1234') {
      userObject = {
        name: 'Erika Mustermann',
        userRole: 'ADMIN',
      };
    }else{
      return this.assertNever();
    }
    return of(userObject).pipe(
      tap(user => {
        Storage.set({ key: TOKEN_KEY, value: JSON.stringify(user) });
        this.currentUser.next(user);
      })
    );
  }

在删除 assertNever() 方法时,最后出现此错误 return:

Variable 'userObject' is used before being assigned. ts(2454)

你得到那个错误是因为你的 'login' 方法应该有一个没有“return”.

的路径

其他路径确实应该 returning 一个“Observable”,这听起来不错。

编辑:

现在我可以看到你的代码,错误似乎在这一行:

return this.assertNever();

可以使用“assertNever()”方法 return“void”/null/nothing???

无论如何,为了避免错误,你可以伪造一个虚拟用户并return它改变这一行:

else {
      \return this.assertNever();
      userObject = {
        name: 'Fake',
        userRole: 'NOLOGGED',
      };
}


在您的函数中添加一些 return 类型将在将来帮助您。据我所见,你的函数 this.assertNever(); 总是抛出但被声明(或推断)为 return void.

将其声明更改为 return never 并且 TS 将识别此函数不会 return。

void = returns,但不return一个值
never = 不会 return / return 值不会被观察到