2016-07-01 10 views
5

Prima che qualcuno segna questo come duplicato si prega di leggere qui di seguito,Creazione di un'istanza di classe in base NomeClasse: stringa

mio scenario non si limita a coinvolgere dattiloscritto ma anche Angular2.

Obiettivo

ho bisogno di un metodo in app.component.ts che prende una stringa (nome classe) e crea un'istanza di questo. Le classi esistono in altri file TS.

Ora per il caso d'uso: Ho un metodo getWidgetObjectFromClassName(className : string) : Object{} che ha bisogno di restituire le istanze del nome della classe che è in formato stringa. Ora il problema,

Ho provato ad utilizzare NameSpace e facendo let instance = new SampleNS['OtherName'](); (SampleNS è uno spazio dei nomi), funziona perfettamente nel caso di un singolo file.

ma ora ho più file TS consente di dire interfaces.ts, classes.ts, otherclasses.ts. Sto usando export namespace SampleNS{} in interface.ts tutto funziona, next in classes.ts usando lo /// <reference path="interfaces.ts" /> e lo stesso namespace SampleNS.

Ora il mio metodo getWidgetObjectFromClassName(className : string) : Object{} è in xyz.ts, e ora quale importazione dovrei fornire ?, il mio punto è se dico "import {SampleNS} da" ./interfaces ". Il problema qui è che posso solo importare lo spazio dei nomi di un singolo file (anche se è lo stesso) quindi l'istanza di creazione im è limitata all'importazione di quello specifico spazio dei nomi di file.

Plunker linkhttps://plnkr.co/edit/pt90F34KPsGoHDpSUQFD?p=preview

+0

cosa circa la creazione di un file che esporta in tutto il componente, allora avete bisogno di importare solo questo file con un namespace e quindi dovresti essere in grado di riferirti a tutti i componenti allo stesso modo? –

+1

* "Prima che qualcuno segnali questo come duplicato, leggi sotto," * - No, preferisco giudicare se le cose sono duplicate lanciando una moneta. – nnnnnn

+0

ok gunter ... provando la tua soluzione tornerà ... –

risposta

6

Usa as con le importazioni come

import * as widgets from './lib'; 
... 
this.widgetInstance = new widgets[className](); 

Plunker example

Mi ricordo questo da un'altra risposta, ma non sono riuscito a trovarlo per dare qualche credito: -/

+0

Come sempre sei stato fantastico! –

1

È possibile utilizzare eval per creare un oggetto dal nome della classe:

class SomeClass 
{ 
    x: number; 
    y: number; 
    constructor() { 
     this.x = this.y = 1; 
    } 

} 



function getWidgetObjectFromClassName(className : string) : {} 
{ 
    return eval("new " + className + "();"); 
} 

console.log("%o", getWidgetObjectFromClassName("SomeClass")); 

giochi here

+0

Funziona perfettamente, ma ora per il mio scenario, quando ho il mio SomeClass su altri file TS e anche se lo importa non lo può trovare. Si prega di controllare –

+2

Probabilmente avrete bisogno di includere modulo o spazio dei nomi: getWidgetObjectFromClassName ("ModuleOrNamespace.SomeClass ") –

+0

Questa non è una soluzione pulita, ma funziona sicuramente, perché downvote? – titusfx

Problemi correlati