Экспортировать класс как интерфейс в 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 }]
...