Treeshakeable providedIn-Syntax 同时将服务接口与实现分开

Treeshakeable providedIn-Syntax while separating service interface from implementation(s)

在我的 angular 项目中,我想将我的服务拆分为接口(抽象 类)和实现(实现这些接口)。例如。来自

import { Injectable } from "@angular/core";
import { ImpyService } from "./implementation/impy.service";

@Injectable({
  providedIn: 'root',
})
export class AggyService {

  doSomething() {
    // ...
  }

}

// "Interface"..

@Injectable({
  providedIn: 'root'
})
export abstract class AggyService {

  abstract doSomething();

}

// & "Implementation..

@Injectable()
export class ImpyService implements AggyService{

  doSomething() {
    // do something
  };

}

现在,由于 AggyService 是抽象的,它只能用于注入密钥,我必须将实现指定为注入 value/provider 并将其添加到 providers- 属性 在 NgModule、组件中,或者 Inject() 它 'directly'.

例如当希望它在我的 app.module.ts

中全局可用时
@NgModule({
  //  ...,
  providers: [
    { provide: AggyService, useClass: ImpyService }
  ]
})
export class AppModule { }

但是-据我所知-这可以防止 tree-shaking,因为该服务现在是在 app.module.ts.

中导入的

我发现,我可以像这样在 @Injectable()-装饰器中指定提供者

@Injectable({
  providedIn: 'root',
  useClass: ImpyService
})
export abstract class AggyService {

  abstract doSomething();

}

这有效(目前),但似乎也没有记录(例如参见 [​​=19=])。

我真的不想坚持未记录的东西,但我不知道如何用另一种方式做到这一点。

怎么办?

因为我只是想为此创建一个问题,我发现它已经存在并且似乎会在将来的某个地方添加到文档中...

(见https://github.com/angular/angular/issues/34107