¿Cómo crear un nuevo objeto a partir del parámetro de tipo en la clase genérica en typescript?

Estoy intentando crear un nuevo objeto de un parámetro de tipo en mi clase genérica. En mi clase “Ver” tengo 2 listas de objetos de tipo genérico pasados ​​como parámetros de tipo, pero cuando trato de hacer una new TGridView() mecanografía new TGridView() dice ” Could not find symbol 'TGridView'...

Este es el código:

 module AppFW { // Represents a view export class View { // The list of forms public Forms: { [idForm: string]: TFormView; } = {}; // The list of grids public Grids: { [idForm: string]: TGridView; } = {}; public AddForm(formElement: HTMLFormElement, dataModel: any, submitFunction?: (e: SubmitFormViewEvent) => boolean): FormView { var newForm: TFormView = new TFormView(formElement, dataModel, submitFunction); this.Forms[formElement.id] = newForm; return newForm; } public AddGrid(element: HTMLDivElement, gridOptions: any): GridView { var newGrid: TGridView = new TGridView(element, gridOptions); this.Grids[element.id] = newGrid; return newGrid; } } } 

¿Puedo crear objetos a partir de un tipo genérico?

    Debido a que el JavaScript comstackdo tiene borrada toda la información del tipo, no puede usar T para actualizar un objeto.

    Puede hacerlo de una forma no genérica pasando el tipo al constructor.

     class TestOne { hi() { alert('Hi'); } } class TestTwo { constructor(private testType) { } getNew() { return new this.testType(); } } var test = new TestTwo(TestOne); var example = test.getNew(); example.hi(); 

    Puede extender este ejemplo usando generics para ajustar los tipos:

     class TestBase { hi() { alert('Hi from base'); } } class TestSub extends TestBase { hi() { alert('Hi from sub'); } } class TestTwo { constructor(private testType: new () => T) { } getNew() : T { return new this.testType(); } } //var test = new TestTwo(TestBase); var test = new TestTwo(TestSub); var example = test.getNew(); example.hi(); 

    Para crear un nuevo objeto dentro del código genérico, debe referirse al tipo por su función de constructor. Entonces, en lugar de escribir esto:

     function activatorNotWorking(type: T): T { return new T(); // compile error could not find symbol T } 

    Necesitas escribir esto:

     function activator(type: { new(): T ;} ): T { return new type(); } var classA: ClassA = activator(ClassA); 

    Vea esta pregunta: Inferencia de Tipo Genérico con Argumento de Clase

    Toda la información de tipo se borra en el lado de JavaScript y, por lo tanto, no se puede actualizar T como en @Sohnee, pero preferiría haber tipeado el parámetro pasado al constructor:

     class A { } class B { Prop: T; constructor(TCreator: { new (): T; }) { this.Prop = new TCreator(); } } var test = new B(A); 
     export abstract class formBase extends baseClass { protected item = {} as T; } 

    Su objeto podrá recibir cualquier parámetro, sin embargo, el tipo T es solo una referencia de mecanografía y no se puede crear a través de un constructor. Es decir, no creará ningún objeto de subclase.

    Yo uso esto: let instance = {}; generalmente funciona EDIT 1:

     export class EntityCollection{ mutable: EditableEntity[] = []; immutable: T[] = []; edit(index: number) { this.mutable[index].entity = Object.assign({}, this.immutable[index]); } } 

    Estaba intentando crear una instancia del genérico dentro de una clase base. Ninguno de los ejemplos anteriores funcionó para mí, ya que requieren un tipo concreto para llamar al método de fábrica.

    Después de investigar durante un tiempo sobre esto e incapaz de encontrar una solución en línea, descubrí que esto parece funcionar.

      protected activeRow: T = {} as T; 

    Las piezas:

      activeRow: T = {} < -- activeRow now equals a new object... 

    ...

      as T; < -- As the type I specified. 

    Todos juntos

      export abstract class GridRowEditDialogBase extends DialogBase{ protected activeRow: T = {} as T; }