2016-05-02 9 views
3

Ich habe eine Typescript-Anwendung, wo ich verschiedene Klassen implementieren müssen, die unterschiedliche Steuerlogik (z. B. , ControlLogicB, ControlLogicC). Alle diese Klassen sind Erweiterungen derselben abstrakten Oberklasse (ControlLogicAbstract).Typescript - ein Objekt erstellen die Klasse dynamisch über ihren Namen

Welche Steuerlogik angewendet wird, wird zur Konfigurationszeit bestimmt und daher weiß ich zur Laufzeit nur den Namen der Klasse, die ich in Form einer Zeichenfolge verwenden muss (z. B. controlLogicClassName).

Nun ist die Frage (n):

1) Ist es möglich, in Typoskript eine Instanz einer Klasse nur aus dem Namen der Klasse (zum Beispiel nur controlLogicClassName zu wissen, beginnen zu erstellen)?

2) Ist es möglich, dies sowohl in einer Browser-Umgebung als auch in einer Node-Umgebung zu tun?

3) Wenn dies in einer Browserumgebung möglich ist, wird es auch von alten Versionen von Browsern unterstützt (sagen wir IE9 und höher)?

Zusätzliche Frage: ist es möglich, eine abstrakte Typescript-Klasse (z.

Vielen Dank im Voraus

Antwort

4

Sie so etwas wie haben:

interface ControlLogicConstrctor { 
    new(): ControlLogicAbstract; 
} 

abstract class ControlLogicAbstract {} 

class ControlLogic1 extends ControlLogicAbstract {} 

class ControlLogic2 extends ControlLogicAbstract {} 

var ctors: { [name: string]: ControlLogicConstrctor } = { 
    "control1": ControlLogic1, 
    "control2": ControlLogic2, 
    // ... 
    "controlN": ControlLogicN 
} 

function factory(name: string): ControlLogicAbstract { 
    let ctor = ctors[name]; 

    if (!ctor) { 
     return null; 
    } 

    return new ctor(); 
} 

Dies sollte gut funktionieren in Browsern und Knoten.
Grundsätzlich in JavaScript sind diese Klassen nur Funktionen, wie dies zum Beispiel:

class MyClass { 
    private x: number; 

    constructor() { 
     this.x = 4; 
    } 
} 

Compiliert in:

var MyClass = (function() { 
    function MyClass() { 
     this.x = 4; 
    } 
    return MyClass; 
}()); 

So Sie am Ende mit MyClass nur eine Funktion zu sein.

Nein, Sie haben keine Möglichkeit, alle Erweiterungsklassen zu erhalten.
Dies wird nicht in TS/JS unterstützt, müssen Sie irgendwie selbst damit umgehen (wie eine Datenstruktur mit den Klassen/Ctors darin, ein bisschen wie meine ctors Objekt).

+0

thx, klar wie das Wasser eines Gebirgsflusses – Picci

Verwandte Themen