In Typoskript ist, generische Parameter bei der Erstellung gelöscht werden und es gibt keine Spur von ihnen in generierten JavaScript-Code. Es gibt also nichts wie CreateInstance
von C#.
Aber wieder im Gegensatz zu C# können Klassen in Typescript zur Laufzeit wie alle anderen Objekte verwendet werden. Wenn Sie also zur Laufzeit eine Instanz einer Klasse erstellen müssen, können Sie dies ganz einfach tun (beachten Sie, dass es zutrifft) nur zu Klassen, nicht zu irgendeiner Art im Allgemeinen).
Die Syntax für generic class type argument sieht ein wenig ungewöhnlich: es ist eine wörtliche Art ist geschrieben wie {new(...args: any[]): T}
Hier abgeschlossen ist (es kompiliert) Beispiel, das etwas tut, wie Sie in Ihrer Frage beschrieben. Zur Vereinfachung habe ich angenommen, dass alle Objekte, die instanziiert werden müssen, dem allgemeinen interface Result
entsprechen müssen (andernfalls müssen Sie in doTheMambo Cast in einen bekannten Typ eingeben, um etwas Nützliches zu tun).
interface Response { json(): any }
interface Result { kind: string }
function handleResult<T extends Result>(tClass: { new (...args: any[]): T }, response: Response): T {
let jsonResp = response.json();
let obj = jsonResp;
let resp: T = new tClass();
doTheMambo(resp, obj);
return resp;
}
class Result1 {
kind = 'result1';
}
function doTheMambo<T extends Result>(response: T, obj: any) {
console.log(response.kind);
}
const r: Result = handleResult(Result1, { json() { return null } });
Was gibt 'response.json()' zurück? Ein Objekt oder eine Zeichenfolgendarstellung dieses Objekts? Und wenn es ein Objekt direkt zurückgibt, was sind die Unterschiede zwischen diesem Objekt und 'T', die Sie in Ihrem' doTheMambo' auflösen möchten? – hvd
Die Antwort.json gibt einen JSON zurück, und der DoTheMambo wird eine Art Pars zwischen den beiden Objekten machen. – BasicSide
Die beiden Objekte können große Unterschiede zwischen den beiden Objekten haben. – BasicSide