Saya ingin pindah ke TypeScript dari JS tradisional karena saya suka sintaks mirip C #. Masalah saya adalah bahwa saya tidak dapat menemukan cara mendeklarasikan kelas statis di TypeScript.
Di C #, saya sering menggunakan kelas statis untuk mengatur variabel dan metode, menempatkan mereka bersama-sama di kelas bernama, tanpa harus membuat instance objek. Di vanilla JS, saya biasa melakukan ini dengan objek JS sederhana:
var myStaticClass = {
property: 10,
method: function(){}
}
Dalam TypeScript, saya lebih suka menggunakan pendekatan C-sharpy saya, tetapi tampaknya kelas statis tidak ada di TS. Apa solusi yang tepat untuk masalah ini?
sumber
.js
dalamhtml
. Jadi untukAngular 2
Anda mungkin menggunakanSystem
... begitu juga melakukanSystem.import("Folder/M");
(atau apa pun jalan ke.js
file yang dikompilasi ) sebelumbootstrap import
Kelas abstrak telah menjadi warga negara kelas satu dari TypeScript sejak TypeScript 1.6. Anda tidak dapat membuat instance kelas abstrak.
Berikut ini sebuah contoh:
sumber
Singleton
adalah untuk pola memori bersama dari instance kelas yang sama. Juga, kelas statis tidak memiliki instance dengan definisi, jadi Anda harus melempar pengecualian jika klien mencoba untuk menginisialisasi itu.abstract
kata kunci didukung dalam TypeScript.abstract
! @ KimchiMan - ide bagus!Mendefinisikan properti dan metode statis suatu kelas dijelaskan dalam 8.2.1 dari Spesifikasi Bahasa Naskah :
di mana
Point.distance()
metode statis (atau "kelas").sumber
Pertanyaan ini cukup tanggal namun saya ingin meninggalkan jawaban yang memanfaatkan versi bahasa saat ini. Sayangnya kelas statis masih belum ada di TypeScript namun Anda dapat menulis kelas yang berperilaku serupa dengan hanya overhead kecil menggunakan konstruktor pribadi yang mencegah instantiasi kelas dari luar.
Cuplikan ini akan memungkinkan Anda untuk menggunakan kelas "statis" mirip dengan mitra C # dengan satu-satunya downside yang masih memungkinkan untuk membuat instance mereka dari dalam. Untungnya, Anda tidak dapat memperpanjang kelas dengan konstruktor pribadi.
sumber
Ini satu cara:
__static_ctor
di sini adalah ekspresi fungsi yang segera dipanggil. Naskah akan menampilkan kode untuk memanggilnya di akhir kelas yang dihasilkan.Pembaruan: Untuk tipe umum dalam konstruktor statis, yang tidak lagi diizinkan untuk direferensikan oleh anggota statis, Anda akan memerlukan langkah tambahan sekarang:
Dalam kasus apa pun, tentu saja, Anda bisa memanggil konstruktor statis tipe generik setelah kelas, seperti:
Hanya ingat untuk TIDAK PERNAH menggunakan
this
di__static_ctor
atas (jelas).sumber
class SomeClass {}
menghasilkan konstruktor - hampir tidak layak dikomentari seolah-olah masalah baru diperkenalkan. ;) FYI: Tidak ada "konstruktor" nyata di JS - hanya fungsi yang memiliki "ini" saat dipanggil pada objek, atau vianew
. Ini ada tidak peduli apa pun untuk "kelas" apa pun.Saya mendapat kasus penggunaan yang sama hari ini (31/07/2018) dan menemukan ini sebagai solusinya. Ini berdasarkan penelitian saya dan itu berhasil untuk saya. Harapan - Untuk mencapai yang berikut dalam TypeScript:
Saya melakukan ini:
Maka kami akan mengkonsumsinya seperti di bawah ini:
Ini berhasil untuk saya. Jika ada yang punya saran lain yang lebih baik, silakan beri tahu kami semua !!! Terima kasih...
sumber
Kelas statis dalam bahasa seperti C # ada karena tidak ada konstruksi tingkat atas lainnya untuk mengelompokkan data dan fungsi. Namun, dalam JavaScript, mereka melakukannya dan jadi lebih alami untuk mendeklarasikan objek seperti yang Anda lakukan. Untuk meniru lebih dekat sintaks kelas, Anda dapat mendeklarasikan metode seperti:
sumber
Lihat http://www.basarat.com/2013/04/typescript-static-constructors-for.html
Ini adalah cara untuk 'memalsukan' konstruktor statis. Ini bukan tanpa bahaya - lihat item codeplex yang dirujuk .
sumber
Salah satu cara yang mungkin untuk mencapai ini adalah memiliki instance statis dari kelas dalam kelas lain. Sebagai contoh:
Kemudian parameter dapat diakses menggunakan Wrapper, tanpa harus mendeklarasikan instance itu. Sebagai contoh:
Jadi Anda mendapatkan manfaat dari objek tipe JavaScript (seperti dijelaskan dalam pertanyaan asli) tetapi dengan manfaat bisa menambahkan pengetikan TypeScript. Selain itu, ia menghindari keharusan menambahkan 'statis' di depan semua parameter di kelas.
sumber
Dengan modul eksternal ES6 ini dapat dicapai seperti:
Ini mencegah penggunaan modul internal dan ruang nama yang dianggap praktik buruk oleh TSLint [1] [2] , memungkinkan pelingkupan privat dan publik dan mencegah inisialisasi objek kelas yang tidak diinginkan.
sumber
Saya sedang mencari sesuatu yang serupa dan menemukan sesuatu yang disebut
Singleton Pattern
.Referensi: Pola Singleton
sumber
Anda juga dapat menggunakan kata kunci
namespace
untuk mengatur variabel, kelas, metode, dan sebagainya. Lihat docsumber