typescript TS2416:型别'MyGuard'中的属性'canActivate'无法指派给基底型别'CanActivate'中的相同属性

cidc1ykv  于 2022-11-26  发布在  TypeScript
关注(0)|答案(6)|浏览(168)

我已经写了一个角4.3.0打字脚本库。当建立我的库,我看到下面的错误在 *.d.ts文件。
[at加载程序]中出现错误..\myLibrary\lib-commonjs\my-guard.service.d.ts:13:5 TS 2416:类型'MyGuard'中的属性'canActivate'无法指派给基底类型'CanActivate'中的相同属性。类型'(下一个:已激活路由快照,状态:路由器状态快照)=〉布尔值|承诺|观察...'不可分配给类型'(路径:已激活路由快照,状态:路由器状态快照)=〉布尔值|可观察|参数...'.类型'布尔值|承诺|可观察的'不可分配给类型'布尔值|可观察|类型“Observable”不能赋给类型“boolean|可观察|'Promise'。类型'Observable'无法指派给类型'Promise'。类型'Observable'中遗漏属性'[Symbol.toStringTag]'。
这是我的护卫长的样子

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

删除返回类型(Observable)后,错误消失|承诺|boolean)。我想知道为什么我需要删除它才能让它工作。

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

错误

6tr1vspr

6tr1vspr1#

您所面临的错误是因为您复制了与您所使用的Angular版本不同的代码。
当您移除传回值时,错误便会消失,因为您已使函式与您计算机上的版本相容。
您可以巡览至计算机上的CanActivate,检查目前版本的函式签章。如果您使用的是Visual Studio程式码,您可以按住Ctrl并按一下它,巡览至其档案。

wmtdaxz3

wmtdaxz32#

@user911 -我最近开始学习Angular ,幸运的是遇到了同样的问题。
出现错误的原因可能是IDE意外地从“q”import {Promise} from 'q'导入了Promise;删除它,您甚至可以声明canActivate方法的返回类型Observable< boolean>| Promise< boolean>| boolean .
当您移除canActivate方法的返回类型时,导入是应用正常工作的唯一原因。
请尝试以下操作以更好地理解:
1.请确保定义canActivate方法的返回类型,并在定义类型时让IDE自动从q导入Promise或手动导入。
1.正如我们所预料的那样,会有错误,现在从返回类型中删除Promise< boolean>,错误应该会消失,除非你用canActivate方法返回一个承诺。

dldeef67

dldeef673#

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

3b6akqbq

3b6akqbq4#

为了匹配父函数签名,我必须指定类型
Observable<boolean|UrlTree>
然后错误就消失了。

canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot) {
return new Observable<boolean|UrlTree>((obs) => {
  this.myService.token.subscribe(ntoken => {
  ...
  obs.next(true);
});
});
jbose2ul

jbose2ul5#

将此(: Observable<boolean> | Promise<boolean> | boolean )更改为:any肯定对您有效

lpwwtiir

lpwwtiir6#

对我来说,我把Observable< Boolean> | Promise< Boolean> | Boolean作为Observable< boolean> | Promise< boolean> | boolean的返回类型,当我替换它时,它就工作了。

相关问题