Estoy tratando de crear un nuevo objeto de un parámetro de tipo en mi clase genérica. En mi clase View
, tengo 2 listas de objetos de tipo genérico pasados como parámetros de tipo, pero cuando intento hacer new TGridView()
, TypeScript dice:
No se pudo encontrar el símbolo 'TGridView
Este es el código:
module AppFW {
// Represents a view
export class View<TFormView extends FormView, TGridView extends GridView> {
// 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 de un tipo genérico?
fuente
new()
necesita, o un comentario más genérico:type: {new(...args : any[]): T ;}
{ new(): T ;}
? Me está costando aprender esta parte.ClassA<T>
y la extiendoClassB extends ClassA<MyClass>
, también tengo que pasarnew () => T = MyClass
o ninguna de estas soluciones funciona.Toda la información de tipo se borra en el lado de JavaScript y, por lo tanto, no puede renovar T como en los estados de @Sohnee, pero preferiría que el parámetro mecanografiado se pasara al constructor:
fuente
Su objeto podrá recibir cualquier parámetro, sin embargo, el tipo T es solo una referencia mecanografiada y no se puede crear a través de un constructor. Es decir, no creará ningún objeto de clase.
fuente
T
, por lo que los captadores / definidores definidos enT
pueden no funcionar.class Foo{ method() { return true; }
, ¡lanzar {} a T no te dará este método!Lo sé tarde, pero la respuesta de @ TadasPa se puede ajustar un poco usando
en vez de
así que el resultado debería verse así
fuente
Estaba tratando de crear una instancia del genérico desde una clase base. Ninguno de los ejemplos anteriores funcionó para mí, ya que requerían un tipo concreto para llamar al método de fábrica.
Después de investigar por un tiempo sobre esto e incapaz de encontrar una solución en línea, descubrí que esto parece funcionar.
Las piezas:
...
Todos juntos
Dicho esto, si necesita una instancia real, debe usar:
Si tiene argumentos, puede usar.
fuente
Esto es lo que hago para conservar la información de tipo:
fuente
Yo uso esto:
let instance = <T>{};
generalmente funciona EDITAR 1:fuente
T
, solo creará un objeto vacío que TypeScript cree que es de tipoT
. Es posible que desee explicar su respuesta con un poco más de detalle.No estoy respondiendo la pregunta, pero hay una buena biblioteca para ese tipo de problemas: https://github.com/typestack/class-transformer (aunque no funcionará para tipos genéricos, ya que realmente no existen en tiempo de ejecución (aquí todo el trabajo se realiza con nombres de clase (que son constructores de clases)))
Por ejemplo:
fuente
Llego tarde a la fiesta, pero así es como lo hice funcionar. Para las matrices necesitamos hacer algunos trucos:
Úselo así:
¡Se puede mejorar pero funcionó para mis necesidades!
fuente
Estoy agregando esto por solicitud, no porque piense que resuelve directamente la pregunta. Mi solución implica un componente de tabla para mostrar tablas de mi base de datos SQL:
Para poner esto en uso, suponga que tengo una vista (o tabla) en mi base de datos VW_MyData y quiero golpear el constructor de mi clase VW_MyData para cada entrada devuelta de una consulta:
La razón por la que esto es deseable en lugar de simplemente asignar el valor devuelto a Datos, es decir que tengo un código que aplica una transformación a alguna columna de VW_MyData en su constructor:
Esto me permite realizar transformaciones, validaciones y cualquier otra cosa en todos mis datos que ingresan a TypeScript. Esperemos que proporcione alguna idea para alguien.
fuente