首页 > 解决方案 > Treeshakeable 提供了In-Syntax,同时将服务接口与实现分开

问题描述

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

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是抽象的,它只能用于注入密钥,我必须将实现指定为注入值/提供者,并将其添加到providersNgModule、组件或Inject()“直接”的 -property 中。

例如,当希望它在我的 app.module.ts 中全局可用时

@NgModule({
  //  ...,
  providers: [
    { provide: AggyService, useClass: ImpyService }
  ]
})
export class AppModule { }

但是-据我所知-这可以防止树抖动,因为现在将服务导入app.module.ts.

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

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

  abstract doSomething();

}

这有效(目前),但似乎也没有记录(例如,参见https://angular.io/api/core/Injectable)。

我真的不想坚持无证的东西,但我不知道如何以另一种方式做到这一点。

如何解决这个问题?

标签: angulartypescriptdependency-injectiontree-shaking

解决方案


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

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


推荐阅读