Saya mencoba membuat objek tipe parameter baru di kelas generik saya. Di kelas saya View
, saya memiliki 2 daftar objek bertipe generik yang dilewatkan sebagai parameter tipe, tetapi ketika saya mencoba membuatnya new TGridView()
, TypeScript mengatakan:
Tidak dapat menemukan simbol 'TGridView
Ini kodenya:
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;
}
}
}
Bisakah saya membuat objek dari tipe generik?
sumber
new()
kebutuhan juga - atau yang lebih umum:type: {new(...args : any[]): T ;}
{ new(): T ;}
. Saya mengalami kesulitan untuk mempelajari bagian ini.ClassA<T>
dan memperluasnyaClassB extends ClassA<MyClass>
, saya juga harus lulusnew () => T = MyClass
atau tidak ada solusi yang berfungsi.Semua jenis informasi dihapus di sisi JavaScript dan oleh karena itu Anda tidak dapat membuat T baru seperti status @Sohnee, tapi saya lebih suka meminta parameter yang diketik diteruskan ke konstruktor:
sumber
Objeknya akan dapat menerima parameter apa pun, namun, tipe T hanya merupakan referensi naskah dan tidak dapat dibuat melalui konstruktor. Artinya, itu tidak akan membuat objek kelas.
sumber
T
, sehingga setiap getter / setter yang didefinisikanT
mungkin tidak berfungsi.class Foo{ method() { return true; }
, casting {} ke T tidak akan memberi Anda metode ini!Saya tahu terlambat tetapi jawaban @ TadasPa dapat disesuaikan sedikit dengan menggunakan
dari pada
jadi hasilnya akan terlihat seperti ini
sumber
Saya sedang mencoba untuk instantiate generik dari dalam kelas dasar. Tak satu pun dari contoh di atas bekerja untuk saya karena mereka memerlukan jenis beton untuk memanggil metode pabrik.
Setelah meneliti sebentar tentang ini dan tidak dapat menemukan solusi online, saya menemukan bahwa ini tampaknya berhasil.
Potongan:
...
Bersama
Yang mengatakan, jika Anda membutuhkan contoh aktual Anda harus menggunakan:
Jika Anda memiliki argumen, Anda dapat menggunakan.
sumber
Inilah yang saya lakukan untuk mempertahankan info jenis:
sumber
saya menggunakan ini:
let instance = <T>{};
umumnya berfungsi EDIT 1:sumber
T
, itu hanya akan membuat objek kosong yang menurut TypeScript adalah tipeT
. Anda mungkin ingin menjelaskan jawaban Anda sedikit lebih detail.Tidak cukup menjawab pertanyaan, tapi, ada perpustakaan yang bagus untuk masalah seperti itu: https://github.com/typestack/class-transformer (walaupun itu tidak akan bekerja untuk tipe generik, karena mereka tidak benar-benar ada pada saat run-time (di sini semua pekerjaan dilakukan dengan nama kelas (yang merupakan konstruktor kelas)))
Misalnya:
sumber
Saya terlambat ke pesta, tapi ini cara saya membuatnya bekerja. Untuk array kita perlu melakukan beberapa trik:
Gunakan seperti ini:
Itu dapat ditingkatkan tetapi berfungsi untuk kebutuhan saya!
sumber
Saya menambahkan ini dengan permintaan, bukan karena saya pikir itu langsung memecahkan pertanyaan. Solusi saya melibatkan komponen tabel untuk menampilkan tabel dari database SQL saya:
Untuk menggunakan ini, anggap saya memiliki tampilan (atau tabel) di basis data saya VW_MyData dan saya ingin mengenai konstruktor kelas VW_MyData saya untuk setiap entri yang dikembalikan dari kueri:
Alasan ini diinginkan daripada hanya memberikan nilai yang dikembalikan ke Data, adalah mengatakan saya punya beberapa kode yang menerapkan transformasi ke beberapa kolom VW_MyData dalam konstruktornya:
Ini memungkinkan saya untuk melakukan transformasi, validasi, dan apa pun pada semua data saya yang masuk ke TypeScript. Semoga ini memberikan wawasan bagi seseorang.
sumber