Estou tentando criar um novo objeto de um parâmetro de tipo na minha classe genérica. Na minha classe View
, tenho 2 listas de objetos do tipo genérico passados como parâmetros de tipo, mas quando tento criar new TGridView()
, o TypeScript diz:
Não foi possível encontrar o símbolo 'TGridView
Este é o 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;
}
}
}
Posso criar objetos de um tipo genérico?
fonte
new()
necessidades de bem - ou um mais genérico:type: {new(...args : any[]): T ;}
{ new(): T ;}
. Estou tendo dificuldades para aprender esta parte.ClassA<T>
e estendê-laClassB extends ClassA<MyClass>
, também tenho que passarnew () => T = MyClass
ou nenhuma dessas soluções funciona.Todas as informações de tipo são apagadas no lado do JavaScript e, portanto, você não pode atualizar o T como os estados @Sohnee, mas eu preferiria ter digitado o parâmetro passado para o construtor:
fonte
Seu objeto poderá receber qualquer parâmetro; no entanto, o tipo T é apenas uma referência de texto datilografado e não pode ser criado por meio de um construtor. Ou seja, ele não criará nenhum objeto de classe.
fonte
T
, portanto, quaisquer getters / setters definidos emT
podem não funcionar.class Foo{ method() { return true; }
, converter {} para T não fornecerá esse método!Eu sei tarde, mas a resposta da @ TadasPa pode ser ajustada um pouco usando
ao invés de
então o resultado deve ficar assim
fonte
Eu estava tentando instanciar o genérico de dentro de uma classe base. Nenhum dos exemplos acima funcionou para mim, pois exigia um tipo concreto para chamar o método de fábrica.
Depois de pesquisar por um tempo sobre isso e incapaz de encontrar uma solução on-line, descobri que isso parece funcionar.
Os pedaços:
...
Todos juntos
Dito isto, se você precisar de uma instância real, deverá usar:
Se você tiver argumentos, poderá usar.
fonte
Isto é o que eu faço para manter as informações de tipo:
fonte
Eu uso isso:
let instance = <T>{};
geralmente funciona EDIT 1:fonte
T
, apenas cria um objeto vazio que o TypeScript pensa que é do tipoT
. Você pode explicar sua resposta com mais detalhes.Ainda não estou respondendo à pergunta, mas há uma boa biblioteca para esse tipo de problema: https://github.com/typestack/class-transformer (embora não funcione para tipos genéricos, pois eles realmente não existem em tempo de execução (aqui todo o trabalho é feito com nomes de classes (que são construtores de classes)))
Por exemplo:
fonte
Estou atrasado para a festa, mas foi assim que consegui. Para matrizes, precisamos fazer alguns truques:
Use-o assim:
Pode ser melhorado, mas funcionou para as minhas necessidades!
fonte
Estou adicionando isso por solicitação, não porque acho que resolve diretamente a questão. Minha solução envolve um componente de tabela para exibir tabelas do meu banco de dados SQL:
Para colocar isso em uso, suponha que eu tenha uma visualização (ou tabela) no meu banco de dados VW_MyData e desejo atingir o construtor da minha classe VW_MyData para cada entrada retornada de uma consulta:
A razão pela qual isso é desejável ao simplesmente atribuir o valor retornado a Data, é dizer que eu tenho algum código que aplica uma transformação a alguma coluna de VW_MyData em seu construtor:
Isso me permite realizar transformações, validações e tudo o mais em todos os meus dados que chegam ao TypeScript. Espero que ele forneça algumas dicas para alguém.
fonte