Экспортировать класс как интерфейс в Angular2

Есть ли способ экспортировать класс как интерфейс, а затем импортировать этот интерфейс в другой модуль в Angular 2? Мне нужно иметь возможность вставлять класс в конструктор в некоторых компонентах, например, должны быть зарегистрированы в качестве поставщика.

1 ответ

Решение

Для использования в качестве токена интерфейса и провайдера это может быть абстрактный класс. Вот как это делается в самой кодовой базе Angular.

Если конкретному классу есть что наследовать от абстрактного класса, последний может быть расширяемым:

export abstract class Foo {
  abstract bar();

  baz() { ... }
}

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

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

В противном случае безопаснее сделать абстрактный класс нерасширяемым и неинстанцируемым:

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

  abstract bar();
}

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

Следует отметить, что любой класс можно использовать в качестве интерфейса в TypeScript. Так что если нет никакой необходимости проводить различие между интерфейсом и реализацией, это может быть только один конкретный класс:

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

  baz() { ... }
}

...
provider: [Foo]
...

Который может быть использован позже в качестве интерфейса при необходимости:

export class SomeFoo implements Foo { ... }

...
provider: [{ provide: Foo, useClass: SomeFoo }]
...
Другие вопросы по тегам