将 class 导出为 Angular2 中的接口

Export class as interface in Angular2

有没有办法将 class 导出为接口,然后在 Angular 2 的另一个模块中导入该接口?我需要能够在某些组件的构造函数中注入 class,例如应该注册为提供者。

为了同时用作接口和提供者令牌,它可能是抽象的class。这就是 Angular 代码库本身的完成方式。

如果具体class有继承抽象class的东西,后者是可扩展的:

export abstract class Foo {
  abstract bar();

  baz() { ... }
}

export class ConcreteFoo extends Foo {
  bar() { ... }
}

...
provider: [{ provide: Foo, useClass: ConcreteFoo }]
...

否则使抽象 class 不可扩展且不可实例化更安全:

export abstract class Foo {
  private constructor() {
    throw new Error('should not be instantiated directly');
  }

  abstract bar();
}

export class ConcreteFoo implements Foo {
  bar() { ... }
}

需要注意的是,任何class都可以作为TypeScript中的接口使用。因此,如果没有真正需要区分接口和实现,它可能只是一个具体的 class:

export class Foo {
  bar() { ... }

  baz() { ... }
}

...
provider: [Foo]
...

如有必要,稍后可以将其用作接口:

export class SomeFoo implements Foo { ... }

...
provider: [{ provide: Foo, useClass: SomeFoo }]
...