切换到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)
更新:对于 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,以防有人遇到同样的问题。
我通过定义注入令牌来解决这个问题:
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 DataService为InjectionToken.
有趣的是,所有通过构造函数向组件注入该服务,例如:
constructor(
ds: DataService
) { }
Run Code Online (Sandbox Code Playgroud)
目前工作。get()当将来删除已弃用的重载时,它们会起作用吗?
我认为这是 Angular 团队的问题。
| 归档时间: |
|
| 查看次数: |
6694 次 |
| 最近记录: |