TS2416:财产可以激活'在类型' MyGuard'不能分配给基本类型中的同一属性' CanActivate'

时间:2018-03-16 19:19:06

标签: angular typescript angular2-routing

我写了一个有角度的4.3.0打字稿库。在构建我的库时,我在* .d.ts文件中看到了以下错误。

  

[at-loader]中的错误.. \ myLibrary \ lib-commonjs \ my-guard.service.d.ts:13:5           TS2416:财产可以激活'在类型' MyGuard'不能分配给基本类型中的同一属性' CanActivate'。         键入'(下一个:ActivatedRouteSnapshot,状态:RouterStateSnapshot)=>布尔值|承诺| OBSERV ...'不能分配类型'(route:ActivatedRouteSnapshot,state:RouterStateSnapshot)=>布尔值|可观察的|镨...&#39 ;.           输入' boolean |承诺|观察到的'不能赋值为' boolean |可观察的|诺&#39 ;.             输入' Observable'不能赋值为' boolean |可观察的|诺&#39 ;.               输入' Observable'不能分配类型'承诺'。                 财产' [Symbol.toStringTag]'类型' Observable'

中缺少

这就是我的后卫的样子

  @Injectable()
    export class MyGuard implements CanActivate {
         canActivate( next: ActivatedRouteSnapshot ,state: RouterStateSnapshot):  Observable<boolean> | Promise<boolean> | boolean  {
return true;
        }
    }

从canActivate中删除返回类型(Observable | Promise | boolean)后,错误消失了。我想了解为什么我需要删除它以使其工作。

 canActivate( next: ActivatedRouteSnapshot ,state: RouterStateSnapshot)  {
    }

错误

6 个答案:

答案 0 :(得分:2)

您面临的错误是因为您复制了与所使用的版本不同的Angular代码。

删除返回值后,错误消失了,因为您使该功能与计算机上的版本兼容。

您可以通过导航到计算机上的CanActivate来检查当前版本的功能签名。如果您使用的是Visual Studio Code,则可以按Ctrl,然后单击它以导航到其文件。

答案 1 :(得分:1)

@ user911-我最近开始学习angular,幸运的是遇到了同样的问题。

该错误的原因可能是您的IDE意外地从'q'import {Promise} from 'q'导入了Promise;删除它,甚至可以声明canActivate方法的返回类型为Observable< boolean> | Promise< boolean> | boolean

当删除canActivate方法的返回类型时,导入是您的应用正常运行的唯一原因。

请尝试以下操作以更好地理解:

  1. 确保您定义了canActivate方法的返回类型,并在定义类型时让IDE自动从q导入Promise或手动将其导入。

  2. 我们希望会出现错误,现在将Promise< boolean>从返回类型中删除,除非您使用canActivate方法返回了诺言,否则错误应该消失。

答案 2 :(得分:0)

问题出在返回的类型中。 这对我有用:

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | 
boolean | UrlTree {

}

答案 3 :(得分:0)

将此(: Observable<boolean> | Promise<boolean> | boolean )更改为:any肯定适合您

答案 4 :(得分:0)

对我来说,解决此问题的原因是导入不匹配。

我创建了一个接口,并在一个类中实现了它。
在该类中,我导入了正确的模块,但是在接口声明中却没有这样做。
这导致编译器对我大吼大叫,花了我一些时间才意识到这是由于导入, Typescript编译器没有提及它。

答案 5 :(得分:-1)

对我来说,我输入了Observable< Boolean> | Promise< Boolean> | Boolean的返回类型Observable< boolean> | Promise< boolean> | boolean istead。 当我更换它时可以使用。