2017-07-12 4 views
0

Ich habe etwas JavaScript-Code, der eine Klasse basierend auf einer Datenstruktur generiert, wobei die Namen und Signaturen ihrer Methoden vom Inhalt dieser Datenstruktur abhängen. Ist es möglich, diese Beziehung in TypeScript darzustellen? Ist es nicht möglich, zumindest anzugeben, dass die Ausgabeklasse über eine bestimmte Menge möglicher Methodensignaturen verfügt, die eine bestimmte (aber zur Kompilierungszeit unbekannte) Menge von Methoden enthält?Ist es möglich, eine Klasse darzustellen, deren Prototyp zur Laufzeit in TypeScript definiert ist?

In meinem speziellen Fall ist die Eingangsdaten könnten wie folgt aussehen:

{ 
    'methodName1': { 
    'flag1': true, 
    'flag2': false 
    }, 
    'methodName2': { 
    'flag1': false, 
    'flag2': false 
    } 
} 

und die resultierende Klasse mit Methoden haben methodName1 und methodName2, mit der Signatur jeder Methode eines von 4 vordefinierten Methodensignaturen, bezogen auf die Werte der Flags.

+0

Da Typoskript wirklich nur während der Kompilierung Zeit existiert, macht es Sinn, dass es Ihnen nicht helfen kann Informationen während der Laufzeit eingeben. Wenn die Datenstruktur natürlich konstant ist, können Sie möglicherweise einen Typ basierend darauf erstellen. Wenn es nur zur Laufzeit verfügbar ist, bin ich mir nicht sicher, ob Sie Ihre dynamischen Objekte einfach als Schlüssel-Wert-Paare eingeben können. Haben Sie ein Beispiel für den Code, den Sie schreiben werden? – y2bd

+0

Die Verwendung einer abstrakten Schnittstelle anstelle einer bestimmten Klasse funktioniert möglicherweise besser für Sie – Bergi

+0

Möchten Sie diese Klassen zur Laufzeit oder zur Kompilierungszeit generieren? Bitte klären Sie. Typ Sicherheit wird zur Kompilierzeit überprüft. Die Laufzeit kommt nach der Kompilierungszeit. Daher können Sie zur Laufzeit bei compiletime keine Schnittstelle definieren. Bedenken Sie, dass dies ein [X/Y-Problem] ist (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem): vielleicht erfordert Ihr Problem keine typesafety/compiletime-Prüfungen (denken Sie Sie müssen Klassen generieren, während sie eigentlich nicht notwendig sind. –

Antwort

0

Mit Ihrer Flagge Beispielen könnten Sie in der Lage sein, eine Fabrik der Art mit Kreuzungstypen zu erstellen:

type Switch<A, B, C, D> = 
    & ((f1: false, f2: false) => A) 
    & ((f1: false, f2: true) => B) 
    & ((f1: true, f2: false) => C) 
    & ((f1: true, f2: true) => D); 

declare let provider: Switch< 
    (arg: number) => number, 
    (arg: string) => string, 
    (arg: boolean) => boolean, 
    (arg: Date) => Date 
>; 

let afun = provider(false, false); 
afun(3); // returns number 

let bfun = provider(false, true); 
bfun("hello"); // returns string 

let cfun = provider(true, false); 
cfun(false); // returns boolean 

let dfun = provider(true, true); 
dfun(new Date()); // returns Date 
Verwandte Themen