2017-05-04 14 views
1

Im typescipt 2を使用しています。 Imは、サーバからモデルを受け取り、使用できるインスタンスに変換するパーサメソッドを記述しています。Typescript(Angular2)ジェネリックコンストラクタファクトリ

コード:

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; 
} 

と私は、コンパイル時エラー

は名前T

を見つけることができませんでし持っている以下のクラス

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

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

を持っていると仮定することができます

今、確かにその構文ではないが、私は方法を見つけることができませんでした。

物をクリアする。これはuseageがどのように見えるかです:

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

NOTE

いくつかの工場出荷時のパターンは、これを解決するだろうが、私は本当にインスタンスを作成し、返す代わりに、いくつかのGenerateCopy方法に滞在したいと思います

答えて

2

Tはタイプであり、classではないため、このエラーが発生します。

のタイプスクリプトにはnew(...args: any[]) => anyの署名があり、Tはこのようなことを行うことができない変数なので、Object.createを呼び出すことができます。

あなたが何をしたいのかを達成するには、引数としてclass自体を渡すことがあります。

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; 
} 

この方法で、受け入れられる唯一のclazzはあなたのタイプを構築するものです。

最近私がgithubに行ったことの例があります(角型プロジェクトではありませんが、問題は純粋なタイスクリプトの問題です)。

この関数の例コール:

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

ここで、最初FooClassclass自体にseconde 1つのリーファーながら、型です。

実行時に型のクラスを取得できないため、その型からクラスを作成するのは唯一の方法です。

+0

そのsynatictically間違っています。 clazz:new(... args:any []):Tが間違っています。 これをclazz:new(... args:any [])=> Tに変換しようとしたところ、コンパイルエラーも発生しました。 –

+0

ああ、このオススメを修正して申し訳ありませんが、 (コピーした例をチェックしてください。) – Supamiu

+0

プロパティ 'コピー'がタイプ 'new(... args:any [])=> T'に存在しません。 タイプ 'new引数:任意の[])=> Tは、」私はあなたが達成したいものを知らなくても、実装を作成したので、私が正しい、あなたがオブジェクトからインスタンスを作成したい場合はああ、それは、だT –

関連する問題