Angular требует, чтобы токен DI был доступен во время выполнения, но вы используете универсальный тип, который исчезнет из сгенерированного JavaScript.
Если вы внимательно прочитаете ответ на вопрос, который вы связали, вы можете заметить, что базовый универсальныйкласс не был предоставлен вообще, а скорее производный класс:
providers: [{ provide: MESSAGE_RESOLVER, useClass: MessageResolver }]
^^^^^^^^^^^^^^^^^
, который содержит определенный токен в своем конструкторе:
export abstract class DetailResolver<T, R extends Repository<T>> implements Resolve<T> {
constructor(protected repositoryService: R, protected router: Router) {}
}
@Injectable()
export class MessageResolver extends DetailResolver<Message, MessageService> {
constructor(repositoryService: MessageService, router: Router) {
^^^^^^^^^^^^^^
available at runtim
super(repositoryService, router);
}
}
В вашем примере вы все еще пытаетесь передать класс с помощьюуниверсальные параметры конструктора, но Angular не знает, какой класс создавать.
Таким образом, вы можете либо создать производный класс, как в примере выше, либо использовать альтернативный рецепт для DI (useFactory):
{
provide: ITEM_RESOLVER,
useFactory: (service, router) => new GenericResolverService(service, router),
deps: [ItemMasterDataService, Router]
}
Кроме того, вы можете использовать свой универсальный класс в качестве токена:
const routes: Routes = [
{
path: ':id', component: ItemMasterDataEditComponent,
resolve: {
item: GenericResolverService
}
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: [
ItemMasterDataService,
{
provide: GenericResolverService,
useFactory: (service, router) => new GenericResolverService(service, router),
deps: [ItemMasterDataService, Router]
}
]
})
export class ItemMasterDataRoutingModule { }
Еще один вариант - использовать реальный токен для вашего dataService
constructor(protected dataService: SomeBaseDateServiceClass) {}
и предоставлять различные реализации на разныхуровни вашего приложения:
{ provide: SomeBaseDateServiceClass, useClass: ItemMasterDataService }