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

Sor*_*raz 22 angular

切换到Angular 5.2.3后,运行ng clilinter "deprecation": truel 规则在我的许多测试中得到以下错误:

get is deprecated: from v4.0.0 use Type<T> or InjectionToken<T>
Run Code Online (Sandbox Code Playgroud)

投诉的界限就像

fixture.debugElement.injector.get(MyService)
Run Code Online (Sandbox Code Playgroud)

MyService被用于依赖注入的类.

我无法猜测新语法应该是什么,如

fixture.debugElement.injector.get<MyService>(MyService)
Run Code Online (Sandbox Code Playgroud)

给出了一个编译错误 Argument of type 'typeof MyService' is not assignable to parameter of type 'Type<MyService> | InjectionToken<MyService>'.

使用进样器以避免弃用错误的正确方法是什么?

编辑:它似乎与MyService是一个抽象类有关.如果我使用非抽象类,则.get<T>(T)语法有效.

小智 15

您可以尝试将服务转换为Type,然后使用这样的注入器:

import { Type } from '@angular/core';

fixture.debugElement.injector.get<MyService>(MyService as Type<MyService>)
Run Code Online (Sandbox Code Playgroud)


Sor*_*raz 8

更新:对于 Angular9,语法已更改为:

TestBed.inject<IDataService>(IDataService).

这也适用于抽象类。

在 VSCode 中,您可以通过此修复大多数情况

FIND: TestBed.get\(([^\)]+)\) as .*;
REPLACE: TestBed.inject<$1>($1);
Run Code Online (Sandbox Code Playgroud)

PRE Angular 9。因此,它似乎与抽象类与非抽象类有关。

我已经在这里发布了我的发现:https : //github.com/angular/angular/issues/22063,以防有人遇到同样的问题。

  • 请在此处发布您的调查结果的相关部分,以便我们可以有一个有价值的(即不是仅链接的)答案来投票,从而用作标记 [其他此类线程] 的基础(/sf/ 49818998/angular-5-appinjector-get-is-deprecated-use-typet-or-injectiontokent) 作为重复项。但是,说到这里,他们只是告诉你问 SO……所以我们会陷入一个循环! (3认同)

Gle*_*enn 6

我通过定义注入令牌来解决这个问题:

export const DATA_SERVICE = new InjectionToken('DataService');
Run Code Online (Sandbox Code Playgroud)

并使用它在模块中为我的服务设置别名:

...
providers = [
    { provide: DataService, useFactory: dataServiceFactory },
    { provide: DATA_SERVICE, useExisting: DataService }
]
...
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用Injector注入令牌直接检索此服务,而不会收到弃用警告:

this.dataService = injector.get(DATA_SERVICE);
Run Code Online (Sandbox Code Playgroud)

就我而言,DataService是一个抽象类,我有两个具体的 ( @Injectable) 实现来在模拟数据和真实 Web 服务数据之间切换。适当的版本在dataServiceFactory方法中实例化。

该调用有两个重载injector.get(),我认为如果没有不InjectionToken推荐使用的重载,就会被调用,因为类型系统无法将其识别typeof DataServiceInjectionToken.

有趣的是,所有通过构造函数向组件注入该服务,例如:

constructor(
    ds: DataService
) { }
Run Code Online (Sandbox Code Playgroud)

目前工作。get()当将来删除已弃用的重载时,它们会起作用吗?

我认为这是 Angular 团队的问题。


小智 5

作为临时修复,您可以尝试以下操作:

fixture.debugElement.injector.get<MyService>(MyService as any)