Jika saya ingin secara sistematis menetapkan properti ke objek dalam Javascript, saya akan melakukannya seperti ini:
var obj = {};
obj.prop = "value";
Namun dalam TypeScript, ini menghasilkan kesalahan:
Properti 'prop' tidak ada pada nilai tipe '{}'
Bagaimana saya bisa menetapkan properti baru ke objek di TypeScript?
typescript
Peter Olson
sumber
sumber
Jawaban:
Dimungkinkan untuk dilambangkan
obj
sebagaiany
, tetapi itu mengalahkan seluruh tujuan menggunakan naskah.obj = {}
menyiratkanobj
adalahObject
. Menandainya sebagaiany
tidak masuk akal. Untuk mencapai konsistensi yang diinginkan, sebuah antarmuka dapat didefinisikan sebagai berikut.ATAU untuk membuatnya kompak:
LooseObject
dapat menerima bidang dengan string apa pun sebagai kunci danany
ketik sebagai nilai.Keanggunan nyata dari solusi ini adalah Anda bisa memasukkan bidang-bidang typesafe di antarmuka.
sumber
LooseObject
bisa mengambil Kesalahan juga.Atau semuanya:
sumber
any
untuk menggunakannya? Hanya menjadi suara tambahan dalam kode saya ..: /any
. TypeScript digunakan untuk menangkap (potensi) kesalahan pada waktu kompilasi. Jika Anda menggunakan untukany
membisukan kesalahan maka Anda kehilangan kekuatan mengetik dan mungkin juga kembali ke JS murni.any
idealnya hanya digunakan jika Anda mengimpor kode yang Anda tidak dapat menulis definisi TS atau saat memigrasi kode Anda dari JS ke TSSaya cenderung untuk menempatkan
any
di sisi lain yaituvar foo:IFoo = <any>{};
Jadi sesuatu seperti ini masih aman:Atau Anda dapat menandai properti ini sebagai opsional:
Cobalah online
sumber
I still have <any>{
maka Anda belum dikompilasi. TypeScript akan menghapusnya dalamvar foo: IFoo = {} as any
lebih disukai. Sintaksis yang lama untuk typecasting bertabrakan dengan TSX (Typescript-ified JSX).Solusi ini berguna ketika objek Anda memiliki Tipe Khusus. Seperti saat mendapatkan objek ke sumber lain.
sumber
Meskipun kompiler mengeluh itu masih harus menampilkannya seperti yang Anda butuhkan. Namun, ini akan berhasil.
sumber
Satu lagi opsi yang dapat dilakukan adalah mengakses properti sebagai koleksi:
sumber
Object.assign(obj, {prop: "value"})
dari ES6 / ES2015 berfungsi juga.Saya terkejut bahwa tidak ada jawaban referensi Object.assign karena itulah teknik yang saya gunakan setiap kali saya berpikir tentang "komposisi" dalam JavaScript.
Dan itu berfungsi seperti yang diharapkan dalam TypeScript:
Keuntungan
any
tipe sama sekali&
ketika mendeklarasikan tipeobjectWithAllProps
), yang dengan jelas mengomunikasikan bahwa kami sedang menyusun tipe baru sambil jalan (yaitu secara dinamis)Hal-hal yang harus diperhatikan
existingObject
tetap tidak tersentuh dan karena itu tidak memilikiemail
properti. Bagi kebanyakan programmer bergaya fungsional, itu adalah hal yang baik karena hasilnya adalah satu-satunya perubahan baru).sumber
Anda dapat membuat objek baru berdasarkan objek lama menggunakan operator spread
TypeScript akan menyimpulkan semua bidang objek asli dan VSCode akan melakukan pelengkapan otomatis, dll.
sumber
Sederhana akan mengikuti
sumber
Dimungkinkan untuk menambahkan anggota ke objek yang ada dengan
sumber
Karena Anda tidak dapat melakukan ini:
Jika kompiler TS dan linter Anda tidak membatasi Anda, Anda dapat menulis ini:
Jika kompiler atau linter TS Anda ketat, jawaban lain adalah mengetikkan:
sumber
Simpan semua properti baru di objek apa pun dengan mengetikkannya ke 'apa saja':
Kemudian Anda dapat mengambilnya dengan melemparkan kembali objek Anda yang diperluas ke 'apa saja':
sumber
Untuk menjamin bahwa jenisnya adalah
Object
(yaitu pasangan nilai kunci ), gunakan:sumber
Kasus 1:
var car = {type: "BMW", model: "i8", color: "white"}; car['owner'] = "ibrahim"; // You can add a property:
Kasus 2:
var car:any = {type: "BMW", model: "i8", color: "white"}; car.owner = "ibrahim"; // You can set a property: use any type
sumber
Anda bisa menggunakan ini:
sumber
Anda dapat menambahkan deklarasi ini untuk membungkam peringatan.
declare var obj: any;
sumber
Praktik terbaik adalah menggunakan pengetikan yang aman, saya sarankan Anda:
sumber
Untuk mempertahankan jenis Anda sebelumnya, tempelkan sementara objek Anda ke sembarang
Properti dinamis baru hanya akan tersedia ketika Anda menggunakan para pemain:
sumber
Ini adalah versi khusus
Object.assign
, yang secara otomatis menyesuaikan tipe variabel dengan setiap perubahan properti. Tidak perlu untuk variabel tambahan, jenis pernyataan, tipe eksplisit atau salinan objek:Catatan: Sampel menggunakan fungsi penegasan TS 3.7 . Jenis kembalinya
assign
adalahvoid
, tidak sepertiObject.assign
.sumber
Jika Anda menggunakan naskah, mungkin Anda ingin menggunakan keamanan jenis; dalam hal ini Obyek telanjang dan 'apa saja' adalah kontra indikasi
Lebih baik tidak menggunakan Objek atau {}, tetapi beberapa jenis bernama; atau Anda mungkin menggunakan API dengan tipe tertentu, yang perlu diperluas dengan bidang Anda sendiri. Saya menemukan ini berfungsi:
sumber
menetapkan properti secara dinamis ke objek dalam TypeScript.
untuk melakukannya, Anda hanya perlu menggunakan antarmuka naskah seperti:
Anda bisa menggunakannya seperti itu
sumber
attributes
bidang di dalamSomeClass
dan itu harus memperbaikinyapublic attributes: IType = {};
pastebin.com/3xnu0TnNCoba ini:
Lalu gunakan itu
sumber
Satu-satunya solusi yang sepenuhnya aman untuk tipe adalah yang ini , tetapi sedikit bertele-tele dan memaksa Anda untuk membuat beberapa objek.
Jika Anda harus membuat objek kosong terlebih dahulu, pilih salah satu dari dua solusi ini. Ingatlah bahwa setiap kali Anda menggunakan
as
, Anda kehilangan keselamatan.Solusi yang lebih aman
Jenis
object
ini aman di dalamgetObject
, yang berartiobject.a
akan jenisstring | undefined
Solusi singkat
Jenis
object
ini tidak aman di dalamgetObject
, yang berartiobject.a
akan jenisstring
bahkan sebelum tugas nya.sumber