Próbuję utworzyć nowy obiekt parametru typu w mojej klasie ogólnej. W mojej klasie View
mam 2 listy obiektów typu ogólnego przekazanych jako parametry typu, ale kiedy próbuję zrobić new TGridView()
, TypeScript mówi:
Nie można znaleźć symbolu „TGridView
To jest kod:
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;
}
}
}
Czy mogę tworzyć obiekty z typu ogólnego?
źródło
new()
również jest to konieczne - lub bardziej ogólny:type: {new(...args : any[]): T ;}
{ new(): T ;}
. Ciężko mi jest nauczyć się tej części.ClassA<T>
i rozszerzam jąClassB extends ClassA<MyClass>
, to też muszę przejśćnew () => T = MyClass
lub żadne z tych rozwiązań nie działa.Wszystkie informacje o typie są usuwane po stronie JavaScript i dlatego nie można tworzyć nowych T, tak jak stany @Sohnee, ale wolałbym, aby wpisany parametr został przekazany do konstruktora:
źródło
Jego obiekt będzie mógł otrzymać dowolny parametr, jednak typ T jest tylko odwołaniem do maszynopisu i nie można go utworzyć za pomocą konstruktora. Oznacza to, że nie utworzy żadnych obiektów klas.
źródło
T
, więc wszelkie metody pobierające / ustawiające zdefiniowane wT
mogą nie działać.class Foo{ method() { return true; }
, rzutowanie {} na T nie da ci tej metody!Wiem późno, ale odpowiedź @ TadasPa można trochę skorygować za pomocą
zamiast
więc wynik powinien wyglądać tak
źródło
Próbowałem utworzyć instancję generyczną z poziomu klasy bazowej. Żaden z powyższych przykładów nie zadziałał dla mnie, ponieważ wymagały konkretnego typu, aby wywołać metodę fabryczną.
Po dłuższych poszukiwaniach na ten temat i nie mogąc znaleźć rozwiązania online, odkryłem, że wydaje się to działać.
Kawałki:
...
Wszyscy razem
To powiedziawszy, jeśli potrzebujesz rzeczywistej instancji, powinieneś użyć:
Jeśli masz argumenty, możesz użyć.
źródło
Oto, co robię, aby zachować informacje o typie:
źródło
używam tego:
let instance = <T>{};
generalnie działa EDYCJA 1:źródło
T
, będzie to po prostu zrobić pustego obiektu, że maszynopis myśli jest typuT
. Możesz bardziej szczegółowo wyjaśnić swoją odpowiedź.Nie do końca odpowiadając na pytanie, ale jest fajna biblioteka dla tego rodzaju problemów: https://github.com/typestack/class-transformer (chociaż nie będzie działać dla typów ogólnych, ponieważ tak naprawdę nie istnieją w czasie wykonywania (tutaj cała praca jest wykonywana z nazwami klas (które są konstruktorami klas)))
Na przykład:
źródło
Spóźniłem się na imprezę, ale tak to działało. W przypadku tablic musimy zrobić kilka sztuczek:
Użyj tego w ten sposób:
Można to poprawić, ale działało na moje potrzeby!
źródło
Dodam to na żądanie, a nie dlatego, że myślę, że to bezpośrednio rozwiązuje kwestię. Moje rozwiązanie obejmuje komponent tabeli do wyświetlania tabel z mojej bazy danych SQL:
Aby to wykorzystać, załóżmy, że mam widok (lub tabelę) w mojej bazie danych VW_MyData i chcę trafić do konstruktora mojej klasy VW_MyData dla każdego wpisu zwróconego z zapytania:
Powodem, dla którego jest to pożądane w porównaniu z prostym przypisywaniem zwracanej wartości do danych, jest to, że mam kod, który stosuje transformację do jakiejś kolumny VW_MyData w swoim konstruktorze:
To pozwala mi wykonywać transformacje, walidacje i cokolwiek innego na wszystkich moich danych przychodzących do TypeScript. Miejmy nadzieję, że zapewni to komuś wgląd.
źródło