首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >canDeactivate的问题:“类型'CanDeactivate‘不是通用的”

canDeactivate的问题:“类型'CanDeactivate‘不是通用的”
EN

Stack Overflow用户
提问于 2019-02-17 07:12:02
回答 1查看 2K关注 0票数 8

我正在尝试在角7中设置一个简单的canDeactivate保护程序,我已经尝试了许多在线教程中的代码,但是它们都产生了相同的错误:

“类型'CanDeactivate‘不是通用的。”

我做错了什么?我甚至在任何谷歌点击上都找不到这个错误,除了另一个有同样问题的2年前未回答的问题。

参见这里的代码:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-17 11:37:28

您的CanDeactivate导入是错误的。您必须像这样从@angular/router导入它:

代码语言:javascript
复制
import { CanDeactivate } from '@angular/router';

这将导出要在项目中使用的正确接口。它是一个具有组件类型类型参数的泛型接口:

代码语言:javascript
复制
export interface CanDeactivate<T> {
  canDeactivate(
      component: T, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot,
      nextState?: RouterStateSnapshot): Observable<boolean|UrlTree>|Promise<boolean|UrlTree>|boolean
      |UrlTree;
}

根据您的导入,角存储库中的文件preactivation.ts导出一个名称相同的接口,但它的用法似乎是角库的内部,而不是用于外部:

代码语言:javascript
复制
export class CanDeactivate {
  constructor(public component: Object|null, public route: ActivatedRouteSnapshot) {}
}

此接口不是泛型的,也没有类型参数,这就是为什么您在使用它时遇到如下错误的原因:

代码语言:javascript
复制
CanDeactivate<CanDeactivateComponent>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54730993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档