Ich versuche, ein neues Objekt eines Typparameters in meiner generischen Klasse zu erstellen. In meiner Klasse habe View
ich zwei Listen von Objekten vom generischen Typ, die als Typparameter übergeben wurden. Wenn ich jedoch versuche, sie zu new TGridView()
erstellen, sagt TypeScript:
Symbol 'TGridView konnte nicht gefunden werden
Dies ist der 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;
}
}
}
Kann ich Objekte aus einem generischen Typ erstellen?
quelle
new()
muss das auch - oder ein allgemeinerer:type: {new(...args : any[]): T ;}
{ new(): T ;}
. Es fällt mir schwer, diesen Teil zu lernen.ClassA<T>
und sie erweitereClassB extends ClassA<MyClass>
, muss ich auch übergebennew () => T = MyClass
oder keine dieser Lösungen funktioniert.Alle Typinformationen werden auf der JavaScript-Seite gelöscht, und daher können Sie T nicht wie bei @Sohnee neu angeben, aber ich würde es vorziehen, wenn typisierte Parameter an den Konstruktor übergeben werden:
quelle
Sein Objekt kann jeden Parameter empfangen, Typ T ist jedoch nur eine Typoskriptreferenz und kann nicht über einen Konstruktor erstellt werden. Das heißt, es werden keine Klassenobjekte erstellt.
quelle
T
, sodass alle in definierten Getter / SetterT
möglicherweise nicht funktionieren.class Foo{ method() { return true; }
, erhalten Sie diese Methode nicht, wenn Sie {} auf T setzen!Ich weiß es spät, aber die Antwort von @ TadasPa kann mit etwas angepasst werden
anstatt
Das Ergebnis sollte also so aussehen
quelle
Ich habe versucht, das Generikum aus einer Basisklasse heraus zu instanziieren. Keines der oben genannten Beispiele hat für mich funktioniert, da ein konkreter Typ erforderlich war, um die Factory-Methode aufzurufen.
Nachdem ich eine Weile darüber recherchiert hatte und online keine Lösung gefunden hatte, stellte ich fest, dass dies anscheinend funktioniert.
Die Stücke:
...
Alle zusammen
Das heißt, wenn Sie eine tatsächliche Instanz benötigen, sollten Sie Folgendes verwenden:
Wenn Sie Argumente haben, können Sie verwenden.
quelle
Dies ist, was ich tue, um Typinformationen beizubehalten:
quelle
Ich benutze dies:
let instance = <T>{};
es funktioniert im Allgemeinen EDIT 1:quelle
T
, sondern es wird lediglich ein leeres Objekt erstellt, von dem TypeScript glaubt , dass es vom Typ istT
. Vielleicht möchten Sie Ihre Antwort etwas ausführlicher erläutern.Die Frage wird nicht ganz beantwortet, aber es gibt eine nette Bibliothek für diese Art von Problemen: https://github.com/typestack/class-transformer (obwohl es für generische Typen nicht funktioniert, da sie nicht wirklich existieren zur Laufzeit (hier wird die ganze Arbeit mit Klassennamen (die Klassenkonstruktoren sind) erledigt))
Zum Beispiel:
quelle
Ich bin zu spät zur Party, aber so habe ich es zum Laufen gebracht. Für Arrays müssen wir einige Tricks machen:
Verwenden Sie es so:
Es kann verbessert werden, aber für meine Bedürfnisse gearbeitet!
quelle
Ich füge dies auf Anfrage hinzu, nicht weil ich denke, dass es die Frage direkt löst. Meine Lösung umfasst eine Tabellenkomponente zum Anzeigen von Tabellen aus meiner SQL-Datenbank:
Angenommen, ich habe eine Ansicht (oder Tabelle) in meiner Datenbank VW_MyData und möchte den Konstruktor meiner VW_MyData-Klasse für jeden von einer Abfrage zurückgegebenen Eintrag aufrufen:
Der Grund, warum dies wünschenswert ist, wenn der zurückgegebene Wert einfach Data zugewiesen wird, ist, dass ich einen Code habe, der eine Transformation auf eine Spalte von VW_MyData in seinem Konstruktor anwendet:
Auf diese Weise kann ich Transformationen, Validierungen und alles andere für alle meine in TypeScript eingehenden Daten durchführen. Hoffentlich bietet es jemandem einen Einblick.
quelle