2016-12-21 7 views
0

У меня есть эта проблема, и найдите часы и не можете найти правильное решение для этого. Я пытаюсь создать универсальную функцию, которая оживляет тип и объект и преобразовывает объект в этот конкретный тип. но у меня возникают проблемы с созданием типичного типа. Я хотел бы знать, если есть что-то, как и в C# Activator.CreateInstanceТип экземпляра экземплярного экземпляра generic object

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()'? Объект или строковое представление этого объекта? И если он возвращает объект напрямую, каковы различия между этим объектом и 'T', которые вы надеетесь разрешить в своем' doTheMambo'? – hvd

+0

Response.json возвращает json, doTheMambo сделает какой-то разбор между двумя объектами. – BasicSide

+0

У двух объектов могут быть существенные различия между ними – BasicSide

ответ

2

В машинописи, общие параметры будут стерты во время компиляции, и нет никаких следов их в сгенерированном коде JavaScript. Итак, нет ничего похожего на CreateInstance с C#.

Но, опять же, в отличие от C#, классы в машинописном тексте могут использоваться во время выполнения, как и любые другие объекты, поэтому, если вам нужно только создать экземпляр класса во время выполнения, вы можете сделать это довольно легко (обратите внимание, что оно применяется только для классов, а не для любого типа вообще).

Синтаксис 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 } }); 
Смежные вопросы