2016-12-21 4 views
0

私はこの問題を抱え、時間を検索してそれに適した解決策を見つけることができません。 私は型とオブジェクトを復活させ、オブジェクトをその特定の型に変換する汎用関数を作成しようとしています。私はジェネリック型をインスタンス化するのに苦労しています。私はtypescriptですでTypescriptは汎用オブジェクトをインスタンス化します

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

「response.json()」は何を返しますか?オブジェクト、またはそのオブジェクトの文字列表現?オブジェクトを直接返すと、 'doTheMambo'で解決しようとしているオブジェクトと' T'の違いは何ですか? – hvd

+0

response.jsonはjsonを返します。doTheMamboは2つのオブジェクト間の何らかの解析を行います。 – BasicSide

+0

2つのオブジェクトに大きな違いがあります – BasicSide

答えて

2

は、一般的なパラメータは、コンパイル時に消去されているC#のActivator.CreateInstanceにのようなものがあると、生成されたJavaScriptコードでそれらの痕跡がないかどうかを知りたいと思います。したがって、C#のCreateInstanceのようなものはありません。

でも、c#と違って、typescriptのクラスは他のオブジェクトと同じように実行時に使うことができるので、実行時にクラスのインスタンスを作成するだけであれば簡単に行うことができますクラスにのみ適用され、一般的なタイプには適用されません)。

generic class type argumentための構文は少し珍しいです:それはここで{new(...args: any[]): T}

として書かれたリテラルタイプだが(それはコンパイル)あなたは、あなたの質問に記述のように何かをする例完了です。簡略化のために、インスタンス化する必要があるすべてのオブジェクトは、共通のinterface Resultに準拠している必要があります(そうでなければ、何か有益なことをするためにdoTheMamboの既知の型に型キャストしなければなりません)。

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 } }); 
関連する問題