Я заметил, что в моем проекте много сервисов преобразователя, которые, несмотря на при работе с разными сущностями и репозиториями размещается один и тот же код. Поэтому я взял на себя задачу свести их к единому сервису преобразователя, используя дженерики:
@Injectable()
export class DetailResolver<T, R extends Repository<T>> implements Resolve<T> {
constructor(private repositoryService: R, private router: Router) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> {
// use repositoryService to resolve this route
}
}
Можно указать тип объекта T и тип репозитория R. Однако у меня проблемы с использованием этого сервиса:
const appRoutes: Routes = [
// other routes
{
path: ':id',
component: MessageEditComponent,
resolve: {
message: DetailResolver<Message, MessageService>
}
}
];
@NgModule({
imports: [
RouterModule.forChild(appRoutes)
],
exports: [
RouterModule
],
providers: [
DetailResolver<Message, MessageService>
]
})
Как только я укажу общий тип в DetailResolver<Message, MessageService>
, компилятор хочет, чтобы я создал экземпляр:
Значение типа typeof DetailResolver не может быть вызвано. Ты хотел добавить новые?
Я не совсем знаком с внутренностями angular4 DI. Может кто-нибудь описать, что не так, есть ли решение этой проблемы? Я использую угловой 4.3.