2017-05-04 1 views
1

Ich benutze typescipt 2. Ich schreibe einige Parser-Methode, die ein Modell vom Server empfängt und wandelt es in eine Instanz, die ich verwenden kann.Typescript (Angular2) Generischer Konstruktor Fabrik

Code:

export interface Constructable { 
    copy(other : any) : void; 
} 

//in my Convert class which converts server responses to model 
private static _parseT<T extends Constructable>(obj : any) : T { 
    let instance = Object.create(T); // the row of the compile-time error 
    instance.constructor.apply(instance); 
    instance.copy(obj); 
    return instance; 
} 

und vermuten lässt ich die folgende Klasse

export class Foo implements Constructable { 
    private test : string = null; 

    public copy(other:any) : void { 
     this.test = other.test; 
    } 
} 

ich eine Kompilierung Fehler haben

konnte nicht Namen T

finden

jetzt, ich bin sicher, es ist nicht die Syntax, aber ich konnte nicht finden, wie.

Um die Dinge zu klären. Dies ist, wie die useage wie folgt aussieht:

public static ParseFoo(data: any) : Foo{ 
    return Convert._parseT<Foo>(data.mResult); // data is a server response object 
} 

HINWEIS

Obwohl einige Fabrik Muster dieses Problem lösen würde ich wirklich mit dem Copy Methode bleiben möchte anstatt einige Generate, die erzeugt und gibt eine Instanz

Antwort

2

Sie erhalten diesen Fehler, weil T ein Typ ist, kein class.

A class in Typoskript hat diese Unterschrift: new(...args: any[]) => any und Sie können Object.create auf ihn nennen, da T keine Variable in Ihrer Funktion ist, dass Sie so etwas nicht tun kann.

Um das zu erreichen, was Sie tun möchten, haben Sie die class sich als Argument übergeben:

private static _parseT<T extends Constructable>(clazz: new(...args: any[]) => any, obj : any) : T { 
    let instance = <Constructable>new clazz(); 
    instance.copy(obj); 
    return <T>instance; 
} 

Auf diese Weise, die einzige clazz, die angenommen werden wird, ist die eine, die Ihren Typ konstruiert.

Sie können ein Beispiel für etwas haben, das ich kürzlich unter github gemacht habe (kein angulares Projekt, aber Ihr Problem ist ein reines Typoskript-Problem).

Ein Beispiel Aufruf dieser Funktion:

let FooInstance = this._parseT<FooClass>(FooClass, myObj); 

Hier ist die erste FooClass der Typ, während die seconde einem Kühlcontainer zum class selbst.

Da Sie die Klasse eines Typs zur Laufzeit nicht erhalten können, ist es die einzige Lösung für Sie, eine Klasse von ihrem Typ zu konstruieren.

+0

ist es synjektiv falsch. clazz: new (... args: any []): T ist falsch. versucht, es in clazz umzuwandeln: new (... args: any []) => T und dann habe ich Kompilierfehler sowie –

+0

oh ja Entschuldigung, ich werde diesen Tippfehler beheben, aber der zweite sollte kompilieren ... oO (Überprüfen Sie das Beispiel, das ich verband, kompiliert es tadellos) – Supamiu

+0

Eigentum 'Kopie' existiert nicht auf Art 'neu (... args: irgendwelche []) => T' Art 'neu (...args: any []) => T 'ist nicht dem Typ T zuweisbar –

Verwandte Themen