更新
介绍
在 Angular 中,服务是使用装饰器提供的@Injectable
。
@Injectable() // -> works
export class MyService {
constructor() {}
}
抽象@Injectable
在 Ivy 之前,可以为@Injectable
(例如用于动态配置提供者、增强服务类)构建抽象。
以下片段显示了如何@Injectable
包装的示例。
function InjectableEnhanced() {
return <T extends new (...args: any[]) => InstanceType<T>>(target: T) => {
Injectable({ providedIn: "root" })(target);
};
}
启用 Ivy 时,使用装饰器InjectableEnhanced
(见上文)不起作用。以下代码被截断会导致运行时错误。
@InjectableEnhanced() // -> does not work
export class MyService {
constructor() {}
}
运行时错误
使用 angular/cli 编译服务@InjectableEnhanced
有效,但浏览器中显示以下错误。相应的项目可以在https://github.com/GregOnNet/ng-9-inject.git找到。
也许,Angular 编译器做了一些代码转换,但不能再在其他装饰器中解析 @Injectable。查看角度存储库,可以在injectable.ts
(参见:https ://github.com/angular/angular/blob/master/packages/core/src/di/injectable.ts#L14 )。
问题
还有一种抽象@Injectable的方法吗?