J'essaye de créer un nouvel objet d'un paramètre de type dans ma classe générique. Dans ma classe View
, j'ai 2 listes d'objets de type générique passés comme paramètres de type, mais quand j'essaye de faire new TGridView()
, TypeScript dit:
Impossible de trouver le symbole «TGridView
Voici le code:
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;
}
}
}
Puis-je créer des objets à partir d'un type générique?
la source
new()
faut aussi - ou un commentaire plus générique:type: {new(...args : any[]): T ;}
{ new(): T ;}
? J'ai du mal à apprendre cette partie.ClassA<T>
et queClassB extends ClassA<MyClass>
je l' étend , je dois également passernew () => T = MyClass
ou aucune de ces solutions ne fonctionne.Toutes les informations de type sont effacées du côté JavaScript et vous ne pouvez donc pas créer de nouveaux T comme les états @Sohnee, mais je préférerais que le paramètre tapé soit passé au constructeur:
la source
Son objet pourra recevoir n'importe quel paramètre, cependant, le type T n'est qu'une référence dactylographiée et ne peut pas être créé via un constructeur. Autrement dit, il ne créera aucun objet de classe.
la source
T
, donc les getters / setters définis dansT
peuvent ne pas fonctionner.class Foo{ method() { return true; }
, lancer {} en T ne vous donnera pas cette méthode!Je sais tard mais la réponse de @ TadasPa peut être légèrement ajustée en utilisant
au lieu de
donc le résultat devrait ressembler à ceci
la source
J'essayais d'instancier le générique à partir d'une classe de base. Aucun des exemples ci-dessus n'a fonctionné pour moi car ils nécessitaient un type concret pour appeler la méthode d'usine.
Après avoir fait des recherches pendant un certain temps à ce sujet et incapable de trouver une solution en ligne, j'ai découvert que cela semble fonctionner.
Les morceaux:
...
Tous ensemble
Cela dit, si vous avez besoin d'une instance réelle, vous devez utiliser:
Si vous avez des arguments, vous pouvez utiliser.
la source
Voici ce que je fais pour conserver les informations de type:
la source
j'utilise ceci:
let instance = <T>{};
cela fonctionne généralement EDIT 1:la source
T
, cela créera simplement un objet vide que TypeScript pense être de typeT
. Vous voudrez peut-être expliquer votre réponse un peu plus en détail.Je ne répond pas tout à fait à la question, mais il existe une belle bibliothèque pour ce genre de problèmes: https://github.com/typestack/class-transformer (bien que cela ne fonctionnera pas pour les types génériques, car ils n'existent pas vraiment au moment de l'exécution (ici tout le travail est fait avec les noms de classes (qui sont des constructeurs de classes)))
Par exemple:
la source
Je suis en retard pour la fête mais c'est ainsi que je l'ai fait fonctionner. Pour les tableaux, nous devons faire quelques astuces:
Utilisez-le comme ceci:
Il peut être amélioré mais a fonctionné pour mes besoins!
la source
J'ajoute cela sur demande, pas parce que je pense que cela résout directement la question. Ma solution implique un composant de table pour afficher les tables de ma base de données SQL:
Pour mettre cela à profit, supposons que j'ai une vue (ou une table) dans ma base de données VW_MyData et que je veux frapper le constructeur de ma classe VW_MyData pour chaque entrée renvoyée par une requête:
La raison pour laquelle cela est souhaitable plutôt que d'attribuer simplement la valeur retournée à Data, c'est que j'ai du code qui applique une transformation à une colonne de VW_MyData dans son constructeur:
Cela me permet d'effectuer des transformations, des validations et tout le reste sur toutes mes données entrant dans TypeScript. Espérons que cela donne un aperçu à quelqu'un.
la source