更新
- 针对此问题打开了一个问题https://github.com/angular/angular/issues/34721
介绍
在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);
};
}
使用装饰器
InjectableEnhanced
(见上文)在启用Ivy时无法正常工作。以下代码片段会导致运行时错误。@InjectableEnhanced() // -> does not work
export class MyService {
constructor() {}
}
运行时错误
使用 angular/cli 编译服务时,使用 @InjectableEnhanced
是可以工作的,但是浏览器会显示以下错误。相应的项目可以在 https://github.com/GregOnNet/ng-9-inject.git 找到。
也许,Angular 编译器做了一些代码转换,但现在无法再解析其他装饰器内部的 @Injectable。
查看 angular 存储库时,在 injectable.ts
中可以找到对 JIT-compiler 的引用(见:https://github.com/angular/angular/blob/master/packages/core/src/di/injectable.ts#L14)。
问题
是否仍有一种方法来抽象 @Injectable?
ɵfac
只是一个 getter,无法将函数分配给它。有什么想法可以克服这个问题吗? - Kirill Metrikɵfac
和ɵprov
getter,这些getter不可修改。针对这种情况,创建普通的Injectable
实例仍然像以前一样工作。我只想知道是否有一种方法在运行时知道构建是否为AOT... - Kirill Metrik(target as any).ɵprov = ɵɵdefineInjectable
,而是使用Object.defineProperty(target, 'ɵprov', {.....})
。 - Kirill Metrik