不推荐使用get:从v4.0.0开始使用Type <t>或InjectionToken <t>

时间:2018-02-07 10:04:42

标签: angular

切换到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>'.语法有效。

5 个答案:

答案 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,警告消失了。