TS2416:“MyGuard”类型中的属性“canActivate”不可分配给基类型“CanActivate”中的相同属性

Posted

技术标签:

【中文标题】TS2416:“MyGuard”类型中的属性“canActivate”不可分配给基类型“CanActivate”中的相同属性【英文标题】:TS2416: Property 'canActivate' in type 'MyGuard' is not assignable to the same property in base type 'CanActivate' 【发布时间】:2018-08-25 22:51:33 【问题描述】:

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

[at-loader] 中的错误 ..\myLibrary\lib-commonjs\my-guard.service.d.ts:13:5 TS2416:“MyGuard”类型中的属性“canActivate”不可分配给基本类型“CanActivate”中的相同属性。 输入'(下一个:ActivatedRouteSnapshot,状态:RouterStateSnapshot)=>布尔|承诺 |观察...' 不可分配给类型 '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean |可观察 |公...'。 输入'布尔|承诺 | Observable' 不可分配给类型 'boolean |可观察 |承诺'。 类型 'Observable' 不可分配给类型 'boolean |可观察 |承诺'。 类型“Observable”不可分配给类型“Promise”。 “Observable”类型中缺少属性“[Symbol.toStringTag]”。

这就是我的后卫的样子

  @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)  
    

错误

【问题讨论】:

如果您删除它,TypeScript 将根据您的返回语句推断返回类型。我假设您要返回这三种类型中的一种,因此返回类型将是与接口的返回签名匹配的单一类型。 您使用的是哪个版本的打字稿?我刚刚尝试使用 v 2.5.3 并且它可以正常工作(虽然在 angular 5 上,但界面从那时起就没有卡住) @David - 我使用的是 typescript 2.7.2 版 你是否在主模块,部分提供者中添加你的后卫?它解决了我的问题 【参考方案1】:

为我解决的问题是 import 不匹配问题。

我创建了一个接口并在一个类中实现了它。 在类中我导入了正确的模块,但我在接口声明中没有这样做。 这导致编译器对我大喊大叫,我花了一些时间才意识到这是因为导入,打字稿编译器没有提到它。

【讨论】:

【参考方案2】:

将此(: Observable&lt;boolean&gt; | Promise&lt;boolean&gt; | boolean ) 更改为:any 绝对适合您

【讨论】:

【参考方案3】:

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

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


【讨论】:

请在您的代码中添加一些解释 - 它的作用是什么,为什么它可以解决问题?【参考方案4】:

对我来说,我输入了返回类型 Observable&lt; Boolean&gt; | Promise&lt; Boolean&gt; | Boolean 而不是 Observable&lt; boolean&gt; | Promise&lt; boolean&gt; | boolean。 当我更换它时。

【讨论】:

这个答案是错误的。 Booleanboolean 是不同的类型。 true 是一个布尔值。【参考方案5】:

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

当您删除返回值时错误消失了,因为您使函数与您机器上的版本兼容。

您可以通过在您的机器上导航到CanActivate 来检查当前版本的函数签名。如果您使用的是 Visual Studio Code,则可以按 Ctrl 并单击它以导航到其文件。

【讨论】:

您可能需要将 rxjs@angular/whatever 添加到 peerDependencies 以确保消除您的答案正确推断的原因。 或者右键单击导入语句中的“CanActivate”,然后单击“Go to Definition”。在我的返回值定义为: Observable&lt;boolean&gt; | Promise&lt;boolean&gt; | boolean 我尝试将相同的版本添加到 peerDependencies,确保所有 package.json 中的版本相同,并尽可能对整个 @angular 文件夹进行并排比较,删除整个node_modules 文件夹,升级打字稿并重新启动计算机。这种令人沮丧的消息仍然存在。唯一有效的方法是复制一个不存在错误的相同项目并从头开始。无论是什么触发了这一切都被埋没了。【参考方案6】:

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

错误的原因可能是你的IDE不小心从'q'import Promise from 'q'导入了Promise;删除它,您甚至可以声明canActivate 方法的返回类型,即Observable&lt; boolean&gt; | Promise&lt; boolean&gt; | boolean.

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

试试这个以获得更好的理解:

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

    正如我们预期的那样,会出现错误,现在从返回类型中删除 Promise&lt; boolean&gt;,除非您使用 canActivate 方法返回承诺,否则错误应该会消失。

【讨论】:

canActivate():any ... 为我做的 @daniel 错了。它将允许您纠正完全不正确的代码并绕过任何检查。

以上是关于TS2416:“MyGuard”类型中的属性“canActivate”不可分配给基类型“CanActivate”中的相同属性的主要内容,如果未能解决你的问题,请参考以下文章

错误 TS2416 类型 'Observable<APIResponse>' 不可分配给类型 'Observable<User>'

vue-ts 中的“VueRouter”类型上不存在属性“历史”

JS 文件中的 TS 警告:“类型 X 上不存在属性 X”:是不是可以编写更干净的 JavaScript?

错误 TS2339:类型“Y”上不存在属性“x”

TS/SFC/RenderProp:无法调用类型缺少调用签名的表达式

Ts中的接口interface