Я пытаюсь создать услугу модального генератора. В конечном счете, я хотел бы использовать его для создания различных типов модалов.Как вы можете вернуть динамически типизированный объект в TypScript/Angular2?
У меня есть функция создания модальных компонентов, и я хотел бы, чтобы он принимал различные типы модальных компонентов в качестве входных данных и возвращал результат ComponentRef < (modaltype)>. Проблема в том, что у меня возникают некоторые проблемы с синтаксисом.
Проблема, в частности, это объявление функции. Это то, что это выглядит как прямо сейчас:
private createModalComponent (compType : Type<Component>, vCref: ViewContainerRef): ComponentRef<compType> { ... }
Это дает мне ошибку, что «не может найти имя„CompType“», который имеет смысл. Поэтому я также попытался более общий подход:
private createModalComponent<T> (compType : T, vCref: ViewContainerRef): ComponentRef<T> { ... }
Но это дало мне ошибку, что «аргумент типа„Т“не может быть назначен для параметра типа„Тип < {}>“
Итак. Я озадачен Как один идти о возврате динамически типизированный объект в машинописи
import { Injectable, ViewChild, ViewContainerRef, ElementRef,
EventEmitter, OnInit, ComponentRef, ComponentFactoryResolver,
Type, ReflectiveInjector } from '@angular/core';
import { WizardModalComponent } from './wizard-modal/wizard-modal.component'
@Injectable()
export class ModalGeneratorService {
constructor(private _cmpFctryRslvr: ComponentFactoryResolver, private _vcRef: ViewContainerRef) {}
private createModalComponent (compType : Type<Component>, vCref: ViewContainerRef): ComponentRef<compType> {
let factory = this._cmpFctryRslvr.resolveComponentFactory(compType);
// vCref is needed cause of that injector..
let injector = ReflectiveInjector.fromResolvedProviders([], vCref.parentInjector);
// create component without adding it directly to the DOM
let comp = factory.create(injector);
return comp;
}
createWizardModalcomponent(vCref : ViewContainerRef) {
createModalComponent(WizardModalComponent, vCref);
}
}
Может ли возврат интерфейса быть решением? –
@SebastienDErrico До тех пор, пока функция принимает тип компонента в качестве ввода и возвращает ComponentRef для этого типа, я буду счастлив. Если мне нужно вложить этот компонент ComponentRef в интерфейс, пусть будет так. Не знаю, как это сделать. – SemperCallide
Я думаю, что это говорит вам, что «невозможно найти compType», потому что объявленный тип возвращаемого значения «». Я не думаю, что это разрешает это, я думаю, может быть, вы пытаетесь заставить функцию изменить свой тип возвращаемого значения на основе того, что ему подано (ваш входящий arg «compType»)? Не уверен, что это сработает.Ради этого, поскольку эта функция в принципе может возвращать любой тип, если вы попробуете или некоторые такие, а не compType, что происходит? Вы также можете попробовать вернуть интерфейс. –