Apakah mungkin untuk mendapatkan nama kelas / jenis objek saat runtime menggunakan TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
typescript
Adam Mills
sumber
sumber
Jawaban:
Jawaban sederhana:
Namun: berhati-hatilah bahwa nama itu kemungkinan akan berbeda ketika menggunakan kode yang diperkecil.
sumber
let instance: any = this.constructor; console.log(instance.name);
any
adalahconsole.log(instance.constructor['name']);
interface Function { name: string; }
- ini akan memperluas definisi "asli".MyClass.name
tidak akan berfungsi dengan baik jika Anda mengecilkan kode Anda. Karena itu akan mengecilkan nama kelas.Aku tahu aku terlambat ke pesta, tapi ternyata ini juga berhasil.
Kalau tidak...
Kode di atas mendapatkan seluruh kode konstruktor sebagai string dan menerapkan regex untuk mendapatkan semua 'kata'. Kata pertama harus 'berfungsi' dan kata kedua harus menjadi nama kelas.
Semoga ini membantu.
sumber
Solusi saya adalah tidak bergantung pada nama kelas. object.constructor.name bekerja secara teori. Tetapi jika Anda menggunakan TypeScript dalam sesuatu seperti Ionic, segera setelah Anda pergi ke produksi itu akan terbakar karena mode produksi Ionic mengecilkan kode Javascript. Jadi kelas diberi nama hal-hal seperti "a" dan "e."
Apa yang saya akhirnya lakukan adalah memiliki kelas typeName di semua objek saya bahwa konstruktor menetapkan nama kelas. Begitu:
Ya, bukan itu yang ditanyakan, sungguh. Tetapi menggunakan constructor.name pada sesuatu yang mungkin berpotensi diperkecil di jalan hanya memohon sakit kepala.
sumber
Lihat pertanyaan ini .
Karena TypeScript dikompilasi ke JavaScript, saat runtime Anda menjalankan JavaScript, jadi aturan yang sama akan berlaku.
sumber
Anda harus terlebih dahulu melemparkan contoh ke
any
karenaFunction
definisi tipe tidak memilikiname
properti.Memperbarui:
Dengan TypeScript 2.4 (dan berpotensi lebih awal) kode dapat lebih bersih:
sumber
Property 'name' does not exist on type 'Function'.
(this as {}).constructor.name
atau(this as object).constructor.name
lebih baik daripadaany
karena Anda benar-benar mendapatkan autocomplete :-)Di Angular2 ini dapat membantu untuk mendapatkan nama komponen:
comp: any diperlukan karena kompilasi TypeScript akan mengeluarkan kesalahan karena Fungsi pada awalnya tidak memiliki nama properti.
sumber
element.nativeElement
- Pada arahan Anda bisa mendapatkan nama komponen seperti ini@Optional() element: ElementRef<HTMLElement>
dan kemudian menggunakanif (element != null && element.nativeElement.tagName.startsWith('APP-')) { this.name = element.nativeElement.tagName; }
Kode TypeScript lengkap
sumber
myClass.prototype.constructor.name
.myClass.constructor.name
Saya mengalami kesalahan TypeScript:error TS2339: Property 'name' does not exist on type 'Function'
.sumber
Solusi ini berfungsi setelah uglifikasi minifikasi tetapi membutuhkan dekorasi kelas dengan metadata.
Kami menggunakan pembuatan kode untuk menghias kelas Entitas kami dengan metadata seperti:
Kemudian konsumsilah dengan pembantu berikut:
sumber
Jika Anda sudah tahu tipe apa yang diharapkan (misalnya, ketika suatu metode mengembalikan tipe gabungan ), maka Anda bisa menggunakan tipe penjaga.
Misalnya, untuk tipe primitif Anda dapat menggunakan typeof guard :
Untuk tipe kompleks Anda dapat menggunakan instanceof penjaga :
sumber