切换到Angular 5.2.3,并使用this.router.navigate(['/account/finalize'], { queryParams: { user: 'user', token: 'your token' } });
的linter规则运行ng cli
后,我的许多测试都出现以下错误:
"deprecation": true
抱怨的行就像是
get is deprecated: from v4.0.0 use Type<T> or InjectionToken<T>
fixture.debugElement.injector.get(MyService)
是用于依赖注入的类。
我无法猜测新语法应该是什么,如
MyService
给出fixture.debugElement.injector.get<MyService>(MyService)
使用注入器避免弃用错误的正确方法是什么?
编辑:它似乎与MyService是一个抽象类有关。如果我使用非抽象类,则Argument of type 'typeof MyService' is not assignable to parameter of type 'Type<MyService> | InjectionToken<MyService>'.
语法有效。
答案 0 :(得分:10)
更好的方法是尝试将服务转换为类型,然后使用注入器,如下所示:
import { Type } from '@angular/core';
fixture.debugElement.injector.get<MyService>(MyService as Type<MyService>)
答案 1 :(得分:4)
作为临时修复,您可以尝试以下操作:
fixture.debugElement.injector.get<MyService>(MyService as any)
答案 2 :(得分:2)
我通过定义注入令牌来解决此问题:
export const DATA_SERVICE = new InjectionToken('DataService');
并使用它为模块中的服务添加别名:
...
providers = [
{ provide: DataService, useFactory: dataServiceFactory },
{ provide: DATA_SERVICE, useExisting: DataService }
]
...
然后我可以使用注入令牌直接从Injector
检索此服务,而不会收到弃用警告:
this.dataService = injector.get(DATA_SERVICE);
就我而言,DataService
是一个抽象类,我有两个具体的例子
(@Injectable
)实现在模拟数据和实际Web服务数据之间切换。适当的版本在dataServiceFactory
方法中实例化。
injector.get()
调用有两个重载,我认为没有InjectionToken
的情况下就调用了不赞成使用的重载,因为类型系统无法将typeof DataService
识别为{{1 }}。
有趣的是,此服务通过构造函数注入到组件的所有情况,例如:
InjectionToken
当前工作。将来移除已弃用的constructor(
ds: DataService
) { }
重载时,它们是否可以工作?
我认为这对Angular团队来说是个问题。
答案 3 :(得分:1)
因此,它似乎与抽象与非抽象类有关。
我在此发布了我的调查结果:https://github.com/angular/angular/issues/22063万一有人遇到同样的问题。
答案 4 :(得分:1)
即使我更改了代码以匹配未弃用的get(),我仍然收到该linter警告。从6.0.0升级Angular CLI之后。到6.2.6,警告消失了。