2016-12-21 2 views
0

Ich habe dieses Problem, und suche nach Stunden und kann nicht die richtige Lösung dafür finden. Ich versuche, eine generische Funktion zu erstellen, die einen Typ und ein Objekt wiederbelebt und das Objekt in diesen bestimmten Typ konvertiert. aber ich habe Probleme, den generischen Typ zu instanziieren. Ich würde gerne wissen, ob es so etwas wie in C# Activator.CreateInstanceTypescript instanziieren generische Objekt

handleResult<T>(response: Response):T { 
    let jsonResp = response.json(); 
    let obj = jsonResp as Object; 
    let resp: T = Object.CreateInstance(T); //   
    doTheMambo(resp, obj); 
    return resp; 
} 
+0

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

+0

Die Antwort.json gibt einen JSON zurück, und der DoTheMambo wird eine Art Pars zwischen den beiden Objekten machen. – BasicSide

+0

Die beiden Objekte können große Unterschiede zwischen den beiden Objekten haben. – BasicSide

Antwort

2

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 } }); 
Verwandte Themen