2017-01-12 2 views
0

Я пытаюсь создать услугу модального генератора. В конечном счете, я хотел бы использовать его для создания различных типов модалов.Как вы можете вернуть динамически типизированный объект в 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); 
    } 
} 
+0

Может ли возврат интерфейса быть решением? –

+0

@SebastienDErrico До тех пор, пока функция принимает тип компонента в качестве ввода и возвращает ComponentRef для этого типа, я буду счастлив. Если мне нужно вложить этот компонент ComponentRef в интерфейс, пусть будет так. Не знаю, как это сделать. – SemperCallide

+0

Я думаю, что это говорит вам, что «невозможно найти compType», потому что объявленный тип возвращаемого значения «». Я не думаю, что это разрешает это, я думаю, может быть, вы пытаетесь заставить функцию изменить свой тип возвращаемого значения на основе того, что ему подано (ваш входящий arg «compType»)? Не уверен, что это сработает.Ради этого, поскольку эта функция в принципе может возвращать любой тип, если вы попробуете или некоторые такие, а не compType, что происходит? Вы также можете попробовать вернуть интерфейс. –

ответ

0

Спасибо всем, кто комментировал и ответил, я нашел ответ, который работает точно так, как я хочу, и это очень просто.

Я просто использовать «любой» типа вместо типа компонента для компонента исх, например, так:

private createModalComponent (compType : Type<Component>, vCref: ViewContainerRef): ComponentRef<any> { ... } 

В такие времена, это всегда помогает помнить, что, хотя Машинопись обычно использует статическую типизацию , достаточно милостиво предоставить нам «любое» ключевое слово. Надеюсь, что кто-то найдет это полезным.

+0

Да, похоже, это сработает. –

0

Это может быть ответом так разместить его здесь:.?

Я посмотрел в файл компонента Фабрика из самого углового каркаса; он использует «любой», но далее в, вот как он объявляет функцию создания (обратите внимание на «<C>»):

create(injector: Injector, projectableNodes?: any[][], rootSelectorOrNode?: string|any) : ComponentRef<C> 

https://angular.io/docs/ts/latest/api/core/index/ComponentFactory-class.html

0

Не совсем уверен, что я понимаю эту проблему полностью, но это может работать:

private createModalComponent<T extends Type<{}>> (compType : T, vCref: ViewContainerRef): ComponentRef<T> { ... } 

Так вы объявить общий тип, но сдерживая его либо быть или расширить тип Type<{}>, что и вторая ошибка, о которой вы говорили, говорила.

 Смежные вопросы

  • Нет связанных вопросов^_^