2017-06-20 6 views
0

Ich habe eine Basisklasse, die um mehrere untergeordnete Klassen erweitert wird. Jetzt möchte ich den Typ der Elternklasse als den Typ einer Eigenschaft haben. Alle Kindtypen sollten ebenfalls gültig sein. Ich habe typeof versucht, aber das funktioniert nicht. Haben Sie Ideen, wie Sie den Typ einer Basisklasse als Typ für eine Eigenschaft festlegen können? Der Grund, warum ich einen Hinweis auf die Art wollen, ist, dass ich zum Beispiel neue test.componentType neue Instanzen der Klasse, zu schaffen in der Lage sein wollen()Typescript typeof Klasse und abgeleitete Klassen

class Parent { 

} 

class Child1 extends Parent { 

} 

class Child2 extends Parent { 

} 

interface Config { 
    componentType: typeof Parent; 
} 

const test: Config = { 
    componentType: typeof Child2 
} 

new test.componentType() -> should create a new instance of Child2 
+0

gibt es keine Notwendigkeit Um typeof zu verwenden, verwenden Sie einfach Parent – toskv

+2

Innerhalb jeder Klasse können Sie einfach 'this.constructor.prototype' verwenden, um die Elternklasse zu erhalten. Es ist nicht klar aus Ihrer Frage, warum Sie diese Eigenschaft in der Schnittstelle definiert haben müssen. – artem

+1

Bearbeitete die Frage jetzt – Abris

Antwort

2

Der Code war eine neue Instanz von Child2 schaffen sollte funktioniert nicht, weil Child2 bereits das Klassenobjekt ist, das mit typeof Parent kompatibel ist. test sollte wie folgt definiert:

const test: Config = { 
    componentType: Child2 
} 

Dennoch scheinen Sie nur das Feld wollen componentType einen Konstruktor zu halten. In diesem Fall können Sie componentType als ein Objekt mit der new Methode prototypisiert machen:

interface Config { 
    componentType: { new(): Parent }; 
} 

const test: Config = { 
    componentType: Child2 
} 

const myinstance: Parent = new test.componentType(); 

Um Informationen über die konstruierten Instanztypen beibehalten, einen generischen Typ verwendet werden kann:

interface Config<T extends Parent> { 
    componentType: { new(): T }; 
} 

const test = { 
    componentType: Child2 
} 

const myinstance: Child2 = new test.componentType(); 
+0

Vielen Dank für eine wirklich gute Antwort :) {new (... args): Parent}; Ich habe es gelöst. – Abris

+1

In der Tat brauchen Sie '(... args)', um Konstruktoren mit nicht leeren Parameterlisten zu erfassen. –

Verwandte Themen