angular - Masalah mengakhiri pernyataan return pada canActivate


Saya mengalami masalah saat menggunakan metode CanActivate: muncul kesalahan ts2366 "Fungsi tidak memiliki pernyataan return akhir dan tipe return tidak termasuk undefined".

Mengikuti kode saya:

import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
import { Injectable } from '@angular/core';

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(private authService: AuthService,
              private router: Router) { }

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    if (this.authService.isAuth) {
      return true;
    } else {
      this.router.navigate(['/auth']);
    }
  }
}

Saya mencoba menambahkan '| undefined' setelah boolean tetapi kesalahan lain memberi tahu saya bahwa itu tidak kompatibel dengan CanActivate.

Apakah kamu punya ide untuk menyelesaikannya?

Terima kasih sebelumnya atas bantuan Anda.

Jawaban #1

Anda seharusnya mengembalikan boolean atau UrlTree dari canActivate. Jika Anda mengembalikan UrlTree, maka itu akan menangani navigasi untuk Anda, jadi Anda tidak perlu memanggil this.router.navigate sendiri (lihat https://angular.io/api/router/CanActivate)

Kode Anda mungkin terlihat seperti ini:

import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
import { Injectable } from '@angular/core';

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(private authService: AuthService,
              private router: Router) { }

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    if (this.authService.isAuth) {
      return true;
    } else {
      return this.router.parseUrl('/auth');
    }
  }
}