Atau berbohong, dengan pernyataan jenis, tetapi Anda akan kehilangan keamanan jenis karena Anda sekarang akan tidak terdefinisi di tempat yang tidak terduga, dan mungkin kesalahan runtime, saat mengakses modal.contentdan sebagainya (properti yang menurut kontrak akan ada di sana).
Anda mungkin berpikir "hei itu benar-benar duplikasi antarmuka" - dan Anda benar. Jika kelas Modal adalah satu-satunya implementasi antarmuka IModal Anda mungkin ingin menghapus antarmuka sama sekali dan menggunakan ...
Terima kasih. Saya berharap untuk tidak harus mendefinisikan semua konten modal pada awalnya. Apakah akan lebih mudah jika daripada antarmuka saya mendefinisikan Modal sebagai kelas dengan properti dan kemudian menggunakan yang baru dan konstruktor untuk mengatur semua nilai awal?
1
Ya - Anda bisa mendefinisikan kelas dan kemudian Anda hanya perlu membuat instance baru saat Anda membutuhkannya. Apakah Anda memerlukan contoh?
Fenton
2
Saya telah menambahkan contoh dan catatan tentang antarmuka.
Fenton
21
var modal = <IModal>{};ini yang saya cari ;-) terima kasih!
Legenda
5
FYI, lebih baik menggunakan {} as IModaldaripada <IModal>{}. Ini menghapus ambiguitas dalam tata bahasa saat menggunakan <foo>pernyataan gaya di JSX. Baca lebih lanjut . Dan tentu saja, gunakan letatau constbukan var.
Alex Klaus
191
Jika Anda ingin objek kosong dari antarmuka, Anda bisa melakukannya:
var modal =<IModal>{};
Keuntungan menggunakan antarmuka sebagai pengganti kelas untuk menyusun data adalah bahwa jika Anda tidak memiliki metode apa pun di kelas, itu akan ditampilkan di JS yang dikompilasi sebagai metode kosong. Contoh:
`Untuk menambahkan komentar di atas. Untuk memanggil fungsi "updateModal (IModal modalInstance) {}", Anda dapat membuat instance inline dari antarmuka 'IModal', seperti ini: // beberapa kode di sini, di mana fungsi updateModal & IModal dapat diakses: updateModal (<IModal> {// baris ini membuat konten instan: '', form: '', href: '', $ form: null, $ message: null, $ modal: null, $ submits: null}); // lengkapi kode Anda `
Sunny
dengan menggunakan var modal= <abc>{}kita baru saja menetapkan modal jenis abc objek kosong tapi di mana kita telah menyatakan jenis modal? saya menggunakan typescript6.
Pardeep Jain
Ini tidak berhasil bagi saya, saya harus menginisialisasi seluruh objek seperti yang dinyatakan dalam jawaban yang diterima.
Rahul Sonwanshi
52
Jika Anda menggunakan Bereaksi, pengurai akan tersedak sintaksis cor tradisional sehingga alternatif diperkenalkan untuk digunakan dalam file .tsx
Saya pikir Anda pada dasarnya memiliki lima opsi berbeda untuk melakukannya. Memilih di antara mereka bisa mudah tergantung pada tujuan yang ingin Anda capai.
Cara terbaik di sebagian besar kasus untuk menggunakan kelas dan instantiate , karena Anda menggunakan TypeScript untuk menerapkan pengecekan tipe.
Bahkan jika metode lain menawarkan cara yang lebih mudah untuk membuat objek dari antarmuka, Anda harus mempertimbangkan memisahkan antarmuka Anda , jika Anda menggunakan objek Anda untuk hal-hal yang berbeda, dan itu tidak menyebabkan pemisahan antarmuka yang berlebihan:
Di sisi lain, misalnya selama unit menguji kode Anda (jika Anda tidak sering menerapkan pemisahan masalah), Anda mungkin dapat menerima kekurangannya demi produktivitas. Anda dapat menerapkan metode lain untuk membuat tiruan sebagian besar untuk antarmuka pihak ketiga * .d.ts besar. Dan itu bisa menyebalkan untuk selalu mengimplementasikan objek anonim penuh untuk setiap antarmuka besar.
Di jalur ini, opsi pertama Anda adalah membuat objek kosong :
var modal =<IModal>{};
Kedua untuk sepenuhnya mewujudkan bagian wajib antarmuka Anda . Ini bisa berguna apakah Anda memanggil perpustakaan JavaScript pihak ketiga, tetapi saya pikir Anda harus membuat kelas sebagai gantinya, seperti sebelumnya:
var modal:IModal={
content:'',
form:'',//...
foo:(param: string):void=>{}};
Ketiga, Anda dapat membuat hanya bagian dari antarmuka Anda dan membuat objek anonim , tetapi dengan cara ini Anda bertanggung jawab untuk memenuhi kontrak
var modal:IModal=<any>{
foo:(param: string):void=>{}};
Meringkas jawaban saya walaupun antarmuka bersifat opsional, karena tidak diubah menjadi kode JavaScript, TypeScript hadir untuk memberikan tingkat abstraksi baru, jika digunakan secara bijak dan konsisten. Saya pikir, hanya karena Anda dapat mengabaikannya di sebagian besar kasus dari kode Anda sendiri, Anda seharusnya tidak melakukannya.
classModal(){constructor(public iModal:IModal){//You now have access to all your interface variables using this.iModal object,//you don't need to define the properties at all, constructor does it for you.}}
Banyak solusi yang diposting sejauh ini menggunakan pernyataan tipe dan karenanya tidak membuang kesalahan kompilasi jika properti antarmuka yang diperlukan dihilangkan dalam implementasi.
Bagi mereka yang tertarik pada beberapa solusi yang kuat dan kompak lainnya :
Opsi 1: Instantiate kelas anonim yang mengimplementasikan antarmuka:
var modal = <IModal>{};
ini yang saya cari ;-) terima kasih!{} as IModal
daripada<IModal>{}
. Ini menghapus ambiguitas dalam tata bahasa saat menggunakan<foo>
pernyataan gaya di JSX. Baca lebih lanjut . Dan tentu saja, gunakanlet
atauconst
bukanvar
.Jika Anda ingin objek kosong dari antarmuka, Anda bisa melakukannya:
Keuntungan menggunakan antarmuka sebagai pengganti kelas untuk menyusun data adalah bahwa jika Anda tidak memiliki metode apa pun di kelas, itu akan ditampilkan di JS yang dikompilasi sebagai metode kosong. Contoh:
mengkompilasi menjadi
yang tidak memiliki nilai. Antarmuka, di sisi lain, tidak muncul di JS sama sekali sambil tetap memberikan manfaat penataan data dan pengecekan tipe.
sumber
var modal= <abc>{}
kita baru saja menetapkan modal jenis abc objek kosong tapi di mana kita telah menyatakan jenis modal? saya menggunakan typescript6.Jika Anda menggunakan Bereaksi, pengurai akan tersedak sintaksis cor tradisional sehingga alternatif diperkenalkan untuk digunakan dalam file .tsx
https://www.typescriptlang.org/docs/handbook/jsx.html
sumber
Saya pikir Anda pada dasarnya memiliki lima opsi berbeda untuk melakukannya. Memilih di antara mereka bisa mudah tergantung pada tujuan yang ingin Anda capai.
Cara terbaik di sebagian besar kasus untuk menggunakan kelas dan instantiate , karena Anda menggunakan TypeScript untuk menerapkan pengecekan tipe.
Bahkan jika metode lain menawarkan cara yang lebih mudah untuk membuat objek dari antarmuka, Anda harus mempertimbangkan memisahkan antarmuka Anda , jika Anda menggunakan objek Anda untuk hal-hal yang berbeda, dan itu tidak menyebabkan pemisahan antarmuka yang berlebihan:
Di sisi lain, misalnya selama unit menguji kode Anda (jika Anda tidak sering menerapkan pemisahan masalah), Anda mungkin dapat menerima kekurangannya demi produktivitas. Anda dapat menerapkan metode lain untuk membuat tiruan sebagian besar untuk antarmuka pihak ketiga * .d.ts besar. Dan itu bisa menyebalkan untuk selalu mengimplementasikan objek anonim penuh untuk setiap antarmuka besar.
Di jalur ini, opsi pertama Anda adalah membuat objek kosong :
Kedua untuk sepenuhnya mewujudkan bagian wajib antarmuka Anda . Ini bisa berguna apakah Anda memanggil perpustakaan JavaScript pihak ketiga, tetapi saya pikir Anda harus membuat kelas sebagai gantinya, seperti sebelumnya:
Ketiga, Anda dapat membuat hanya bagian dari antarmuka Anda dan membuat objek anonim , tetapi dengan cara ini Anda bertanggung jawab untuk memenuhi kontrak
Meringkas jawaban saya walaupun antarmuka bersifat opsional, karena tidak diubah menjadi kode JavaScript, TypeScript hadir untuk memberikan tingkat abstraksi baru, jika digunakan secara bijak dan konsisten. Saya pikir, hanya karena Anda dapat mengabaikannya di sebagian besar kasus dari kode Anda sendiri, Anda seharusnya tidak melakukannya.
sumber
Anda dapat melakukan
sumber
Karena saya belum menemukan jawaban yang sama di atas dan jawaban saya berbeda. Saya lakukan:
sumber
Menggunakan antarmuka Anda bisa Anda lakukan
sumber
Berikut ini pendekatan lain:
Anda cukup membuat objek ramah ESLint seperti ini
Atau instance default berdasarkan antarmuka dan dengan default yang masuk akal, jika ada
Kemudian variasi instance default cukup dengan mengganti beberapa properti
sumber
Banyak solusi yang diposting sejauh ini menggunakan pernyataan tipe dan karenanya tidak membuang kesalahan kompilasi jika properti antarmuka yang diperlukan dihilangkan dalam implementasi.
Bagi mereka yang tertarik pada beberapa solusi yang kuat dan kompak lainnya :
Opsi 1: Instantiate kelas anonim yang mengimplementasikan antarmuka:
Opsi 2: Buat fungsi utilitas:
sumber
Anda dapat mengatur nilai default menggunakan
Class
.Tanpa Konstruktor Kelas:
Dengan Konstruktor Kelas
sumber