Saya melihat implementasi anggota pribadi di TypeScript, dan saya merasa agak membingungkan. Intellisense tidak mengizinkan untuk mengakses anggota pribadi, tetapi dalam JavaScript murni, semuanya ada di sana. Ini membuat saya berpikir bahwa TS tidak mengimplementasikan anggota privat dengan benar. Ada pemikiran?
class Test{
private member: any = "private member";
}
alert(new Test().member);
javascript
typescript
Sean Feldman
sumber
sumber
Jawaban:
Seperti halnya pemeriksaan tipe, privasi anggota hanya diterapkan di dalam kompilator.
Properti pribadi diimplementasikan sebagai properti biasa, dan kode di luar kelas tidak diizinkan untuk mengaksesnya.
Untuk membuat sesuatu yang benar-benar pribadi di dalam kelas, itu tidak bisa menjadi anggota kelas, itu akan menjadi variabel lokal yang dibuat di dalam ruang lingkup fungsi di dalam kode yang membuat objek. Itu berarti Anda tidak dapat mengaksesnya seperti anggota kelas, misalnya menggunakan
this
kata kunci.sumber
this
kata kunci.JavaScript mendukung variabel privat.
Dalam TypeScript ini akan diekspresikan seperti ini:
EDIT
Pendekatan ini sebaiknya hanya digunakan SEPENUHNYA jika benar-benar dibutuhkan. Misalnya jika Anda perlu menyimpan sandi sementara.
Ada biaya kinerja untuk menggunakan pola ini (tidak relevan dengan Javascript atau Typecript) dan sebaiknya hanya digunakan jika benar-benar diperlukan.
sumber
var _this
untuk digunakan dalam fungsi cakupan? Mengapa Anda ragu melakukannya di ruang lingkup kelas?Setelah dukungan untuk WeakMap tersedia lebih luas, ada teknik menarik yang dirinci dalam contoh # 3 di sini .
Ini memungkinkan data pribadi DAN menghindari biaya kinerja contoh Jason Evans dengan memungkinkan data dapat diakses dari metode prototipe alih-alih hanya metode contoh.
Halaman WeakMap MDN yang ditautkan mencantumkan dukungan browser di Chrome 36, Firefox 6.0, IE 11, Opera 23, dan Safari 7.1.
sumber
protected
parameter? : DKarena TypeScript 3.8 akan dirilis, Anda akan dapat mendeklarasikan bidang pribadi yang tidak dapat diakses atau bahkan dideteksi di luar kelas yang memuatnya .
Bidang pribadi dimulai dengan
#
karakterHarap dicatat bahwa bidang pribadi ini akan menjadi sesuatu yang berbeda dari bidang yang ditandai dengan
private
kata kunciRef. https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/
sumber
Terima kasih kepada Sean Feldman untuk tautan ke diskusi resmi tentang masalah ini - lihat jawabannya untuk tautannya.
Saya membaca diskusi yang ditautkannya, dan inilah ringkasan dari poin-poin utamanya:
this
tanpa semacam solusi@private
Beri anotasi pada metode privat dengan begitu minifier yang mengenali bahwa anotasi dapat mengecilkan nama metode secara efektifArgumen balasan keseluruhan untuk menambahkan dukungan visibilitas dalam kode yang dipancarkan:
sumber
Dalam TypeScript Private, fungsi hanya dapat diakses di dalam kelas. Suka
Dan itu akan menunjukkan kesalahan ketika Anda mencoba mengakses anggota pribadi. Berikut contohnya:
sumber
Saya menyadari ini adalah diskusi yang lebih lama tetapi mungkin masih berguna untuk membagikan solusi saya untuk masalah variabel dan metode yang seharusnya pribadi dalam TypeScript "bocor" ke antarmuka publik dari kelas JavaScript yang dikompilasi.
Bagi saya, masalah ini murni kosmetik, yaitu semua tentang kekacauan visual saat variabel instance dilihat di DevTools. Perbaikan saya adalah mengelompokkan deklarasi pribadi bersama-sama di dalam kelas lain yang kemudian dipakai di kelas utama dan ditugaskan ke
private
variabel (tapi masih terlihat secara publik di JS) dengan nama seperti__
(garis bawah ganda).Contoh:
Saat
myClass
instance dilihat di DevTools, alih-alih melihat semua anggota "pribadi" bercampur dengan yang benar-benar publik (yang bisa menjadi sangat berantakan secara visual dalam kode kehidupan nyata yang difaktor ulang dengan benar) Anda melihatnya dikelompokkan dengan rapi di dalam__
properti yang diciutkan :sumber
Berikut pendekatan yang dapat digunakan kembali untuk menambahkan properti pribadi yang tepat:
Katakanlah Anda memiliki kelas di
Client
suatu tempat yang membutuhkan dua properti pribadi:prop1: string
prop2: number
Di bawah ini adalah bagaimana Anda menerapkannya:
Dan jika yang Anda butuhkan hanyalah satu properti pribadi, maka itu menjadi lebih sederhana, karena Anda tidak perlu mendefinisikannya
ClientPrivate
dalam kasus itu.Perlu dicatat, bahwa untuk sebagian besar, kelas
Private
hanya menawarkan tanda tangan yang dapat dibaca dengan baik, sedangkan penggunaan langsungWeakMap
tidak.sumber