Saya mencoba membuat get dan set metode untuk properti:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Apa kata kunci untuk menetapkan nilai?
typescript
MuriloKunze
sumber
sumber
typescript private name: string; getName() { get: { return this.name; } set: { this.name = ???; } }
Jawaban:
TypeScript menggunakan sintaks pengambil / penyetel yang seperti ActionScript3.
Itu akan menghasilkan JavaScript ini, menggunakan fitur ECMAScript 5
Object.defineProperty()
.Jadi untuk menggunakannya,
Namun, untuk menggunakannya sama sekali, Anda harus memastikan compiler TypeScript menargetkan ECMAScript5. Jika Anda menjalankan kompiler baris perintah, gunakan
--target
flag seperti ini;Jika Anda menggunakan Visual Studio, Anda harus mengedit file proyek Anda untuk menambahkan bendera ke konfigurasi untuk alat membangun TypeScriptCompile. Anda dapat melihatnya di sini :
Seperti yang disarankan @DanFromGermany di bawah ini, jika Anda hanya membaca dan menulis properti lokal
foo.bar = true
, maka memiliki pasangan penyetel dan pengambil adalah berlebihan. Anda selalu dapat menambahkannya nanti jika Anda perlu melakukan sesuatu, seperti mencatat, kapan pun properti dibaca atau ditulis.sumber
myFoo.bar = true
bukanmyFoo.bar(true);
ataumyFoo.setBar(true);
??Ezward telah memberikan jawaban yang baik, tetapi saya perhatikan bahwa salah satu komentar bertanya bagaimana itu digunakan. Bagi orang-orang seperti saya yang menemukan pertanyaan ini, saya pikir akan bermanfaat untuk memiliki tautan ke dokumentasi resmi tentang getter dan setter di situs web Script karena menjelaskannya dengan baik, mudah-mudahan akan selalu tetap up-to-date karena perubahan dibuat, dan menunjukkan contoh penggunaan:
http://www.typescriptlang.org/docs/handbook/classes.html
Khususnya, bagi mereka yang tidak terbiasa dengan itu, perhatikan bahwa Anda tidak memasukkan kata 'masuk' ke dalam panggilan ke seorang pengambil (dan juga untuk setter):
Anda cukup melakukan ini:
diberi kelas seperti:
maka pengambil 'bar' untuk properti '_bar' pribadi akan dipanggil.
sumber
Berikut ini contoh yang berfungsi yang seharusnya mengarahkan Anda ke arah yang benar:
Getters dan setter dalam JavaScript hanyalah fungsi normal. Setter adalah fungsi yang mengambil parameter yang nilainya adalah nilai yang ditetapkan.
sumber
static
.Foo._name
harus diganti denganthis._name
Anda bisa menulis ini
sumber
public
di sini mendefinisikan anggota duplikat.TS menawarkan getter dan setter yang memungkinkan properti objek memiliki kontrol lebih besar tentang bagaimana mereka diakses (pengambil) atau diperbarui (setter) di luar objek. Alih-alih secara langsung mengakses atau memperbarui properti, fungsi proxy dipanggil.
Contoh:
sumber
Ini sangat mirip dengan membuat metode umum, cukup cantumkan kata kunci
get
atauset
di awal.Dalam hal ini Anda dapat melewati ketik kembali
get getMethod1() {
sumber
Saya pikir saya mungkin mengerti mengapa itu sangat membingungkan. Dalam contoh Anda, kami menginginkan getter dan setter
_name
. Tapi kami mencapainya dengan membuat getter dan setter untuk variabel kelas yang tidak terkaitName
.Pertimbangkan ini:
Kode di atas tidak mengikuti:
get
danset
buat getter dan setter untukyourCarTiresCount
( bukan untuktiresCount
).Pembuatnya adalah:
dan penyetelnya adalah:
Artinya, setiap kali kita melakukannya
new Car().yourCarTiresCount
, rajin giat berlari. Dan untuk setiapnew Car().yourCarTiresCount('7')
setter berjalan.tireCount
.sumber
Jika Anda mencari cara untuk menggunakan get dan set pada objek apa pun (bukan kelas)
Proxy
mungkin berguna: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ProxyCatatan: perlu diketahui bahwa ini adalah api baru yang tidak didukung dan diperlukan polifill untuk browser lama
sumber
Jika Anda bekerja dengan modul TypeScript dan mencoba menambahkan pengambil yang diekspor, Anda dapat melakukan sesuatu seperti ini:
Kemudian, di file lain yang Anda miliki:
sumber
this
harus tidak ditentukan pada lingkup tingkat atas modul. Anda dapat menggunakannyaexports
sebagai gantinya tetapi Anda tidak boleh melakukannya sama sekali karena secara praktis dijamin akan menyebabkan masalah kompatibilitas