Проблема с canDeactivate: «Тип CanDeactivate не является универсальным» - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь настроить простую защиту canDeactivate в Angular 7, и я пробовал код из ряда онлайн-учебников, но все они выдают одну и ту же ошибку:

"Type" CanDeactivate«не является общим».

Что я делаю не так?Я даже не могу найти эту ошибку ни в одном из обращений Google, кроме еще одного вопроса, оставшегося без ответа 2 года, с той же проблемой.

См. Код здесь:

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { CanDeactivate } from '@angular/router/src/utils/preactivation';

export interface CanDeactivateComponent {
    canDeactivate: () => Observable<boolean> | boolean;
}

@Injectable()
export class CanDeactivateGuard implements CanDeactivate<CanDeactivateComponent> {
    canDeactivate(component) {
        return component.canDeactivate ? component.canDeactivate() : true;
    }
}

1 Ответ

0 голосов
/ 17 февраля 2019

Ваш CanDeactivate импорт неправильный.Вы должны импортировать его из @angular/router следующим образом:

import { CanDeactivate } from '@angular/router';

Это позволит экспортировать правильный интерфейс для использования в вашем проекте.Это общий интерфейс с параметром типа для типа вашего компонента:

export interface CanDeactivate<T> {
  canDeactivate(
      component: T, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot,
      nextState?: RouterStateSnapshot): Observable<boolean|UrlTree>|Promise<boolean|UrlTree>|boolean
      |UrlTree;
}

В соответствии с вашим импортом файл preactivation.ts в репозитории Angular экспортирует интерфейс с тем же именемно использование которого, по-видимому, является внутренним для угловой библиотеки и не предназначено для использования вне ее:

export class CanDeactivate {
  constructor(public component: Object|null, public route: ActivatedRouteSnapshot) {}
}

Этот интерфейс не является универсальным и не имеет параметра типа, поэтому при использовании вы получаете ошибкуэто так:

CanDeactivate<CanDeactivateComponent>
...