Private Class Fields
TypeScript versi 3.8, menambahkan atribut `private`, dimana hal tersebut
merupakan sebuah cara untuk mendeklarasikan sebuah atribut kelas
yang tidak dapat diakses diluar kelas tempat atribut tersebut
dinyatakan, termasuk oleh kelas turunannya.
Sebagai contoh, kelas Orang di bawah ini tidak mengizinkan siapapun
menggunakan objek dari kelas tersebut untuk membaca nama depan,
nama belakang, atau prefiks
// Pertanyaan umum yang seringkali kami dapatkan adalah
"Mengapa Anda memilih cara ini dibandingkan kata kunci `private` pada
sebuah atribut kelas?" - mari kita bandingkan kedua hal tersebut
dengan membandingkan cara kerjanya pada TypeScript sebelum versi 3.8:
class Orang {
#namaDepan: string;
#namaBelakang: string;
#prefiks: string;
constructor(namaDepan: string, namaBelakang: string, prefiks: string) {
this.#namaDepan = namaDepan;
this.#namaBelakang = namaBelakang;
this.#prefiks = prefiks;
}
sapa() {
// Di Islandia, nama lengkap lebih umum digunakan dibandingkan
// bentuk [prefix] [nama belakang]
// https://www.w3.org/International/questions/qa-personal-names#patronymic
if (navigator.languages[0] === "is") {
console.log(`Góðan dag, ${this.#namaDepan} ${this.#namaBelakang}`);
} else {
console.log(`Halo, ${this.#prefiks} ${this.#namaBelakang}`);
}
}
}
let jeremy = new Orang("Jeremy", "Bearimy", "Mr");
// Anda tidak dapat mengakses atribut `private` di luar kelas tersebut:
// Sebagai contoh, ekspresi di bawah ini tidak valid:
console.log(jeremy.#namaBelakang);
// Begitu pun ekspresi di bawah ini:
console.log("Nama belakang orang adalah:", jeremy["#namaBelakang"]);
// Pernyataan tersebut tidak memperbolehkan Anda mengakses atribut
nama menggunakan notasi titik.
class Anjing {
private _nama: string;
constructor(nama: string) {
this._nama = nama;
}
}
let oby = new Anjing("Oby");
// Namun, TypeScript memperbolehkan pengaksesan atribut sebagai
jalan keluarnya.
oby._nama = "Spot";
// Referensi TypeScript pada sebuah atribut `private` hanya tersedia
pada tingkat tipe saja yang berarti Anda hanya dapat mempercayai
izin akses sampai tingkat tersebut saja. Melalui atribut `private`
yang akan menjadi bagian dari bahasa JavaScript, maka Anda dapat
membuat jaminan yang lebih baik mengenai visibilitas pada kode
program Anda.
Kami tidak berencana untuk menghapus dukungan terhadap
kata kunci `private` pada TypeScript, sehingga kode program
Anda tetap dapat dijalankan, namun sekarang Anda dapat menulis
kode program yang lebih dekat dengan bahasa JavaScript.
Anda dapat mempelajari lebih lanjut tentang atribut kelas
pada proposal tc39
https://github.com/tc39/proposal-class-fields/
dan catatan rilis _beta_:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/#ecmascript-private-fields
oby["_nama"] = "Cherny";