Di kelas-kelas TypeScript dimungkinkan untuk mendeklarasikan tipe untuk properti, misalnya:
class className {
property: string;
};
Bagaimana cara mendeklarasikan tipe properti dalam objek literal?
Saya sudah mencoba kode berikut tetapi tidak dikompilasi:
var obj = {
property: string;
};
Saya mendapatkan kesalahan berikut:
Nama 'string' tidak ada dalam cakupan saat ini
Apakah saya melakukan sesuatu yang salah atau ini bug?
typescript
Dace Zarina
sumber
sumber
Pembaruan 2019-05-15 (Pola Kode Peningkatan sebagai Alternatif)
Setelah bertahun-tahun menggunakan
const
dan mendapatkan manfaat dari kode yang lebih fungsional, saya akan merekomendasikan untuk tidak menggunakan di bawah ini dalam banyak kasus. (Saat membangun objek, memaksa sistem tipe ke dalam tipe tertentu alih-alih membiarkannya menyimpulkan tipe sering merupakan indikasi bahwa ada sesuatu yang salah).Sebagai gantinya saya akan merekomendasikan menggunakan
const
variabel sebanyak mungkin dan kemudian menyusun objek sebagai langkah terakhir:Penambahan 2020-02-26
Jika Anda benar-benar membutuhkan jenis yang Anda dapat diinisialisasi dengan malas: Tandai itu adalah jenis gabungan yang dapat dibatalkan (nol atau Jenis). Sistem tipe akan mencegah Anda menggunakannya tanpa terlebih dahulu memastikan memiliki nilai.
Di
tsconfig.json
, pastikan Anda mengaktifkan pemeriksaan nol yang ketat:"strictNullChecks": true
Kemudian gunakan pola ini dan izinkan sistem tipe untuk melindungi Anda dari akses null / undefined yang tidak disengaja:
Jangan lakukan hal di bawah ini dalam 99% kasus:
Pembaruan 2016-02-10 - Untuk Menangani TSX (Terima Kasih @Josh)
Gunakan
as
operator untuk TSX.Contoh yang lebih panjang:
Jawaban Asli
Gunakan operator transmisi untuk membuat ringkas ini (dengan memberikan null ke jenis yang diinginkan).
Contoh yang lebih panjang:
Ini jauh lebih baik daripada memiliki dua bagian (satu untuk mendeklarasikan tipe, yang kedua untuk menyatakan default):
sumber
property: null as string
mana perbedaan penting adalahas
operator.call
dalam contoh kedua Anda, dapatkah Anda menetapkan jenis yang sama sekali berbeda untuk itu?Error:(33, 15) TS2352:Type 'null' cannot be converted to type 'string'.
Saya terkejut bahwa tidak ada yang menyebutkan ini tetapi Anda hanya bisa membuat antarmuka yang disebut
ObjectLiteral
, yang menerimakey: value
pasangan jenisstring: any
:Maka Anda akan menggunakannya, seperti ini:
Bonus tambahan adalah Anda dapat menggunakan kembali antarmuka ini berkali-kali sesuai kebutuhan, pada banyak objek yang Anda inginkan.
Semoga berhasil.
sumber
[key: string]
bagian, bukan bagian apa pun sebagai definisi jenis nilai ... Itu memang akan menghilangkan kegunaan jenis.Jika Anda mencoba menulis anotasi jenis, sintaksnya adalah:
Jika Anda mencoba menulis objek literal, sintaksnya adalah:
Kode Anda mencoba menggunakan nama jenis di posisi nilai.
sumber
var x: { property: string; } = ...;
menggoda! Saya berharap elipsis adalah sintaks yang valid untuk menjadi singkatanvar x: { property: string; } = { property: 'hello' };
.Dalam TypeScript jika kita mendeklarasikan objek maka kita akan menggunakan sintaks berikut:
Sebagai contoh:
sumber
Jika Anda mencoba menambahkan pengetikan ke objek literal yang dirusak , misalnya dalam argumen ke suatu fungsi, sintaksnya adalah:
sumber
Jika properti Anda memiliki tipe yang sama, Anda bisa menggunakan tipe utilitas yang telah ditentukan
Record
:Tentu saja Anda dapat melangkah lebih jauh dan menentukan jenis khusus untuk nilai properti Anda:
sumber
let
bukan divar
sini.sumber
Dalam kode Anda:
Anda sebenarnya membuat objek literal dan menetapkan string variabel ke properti myProp. Meskipun praktik yang sangat buruk ini sebenarnya akan menjadi kode TS yang valid (jangan gunakan ini!):
Namun, yang Anda inginkan adalah objek literal diketik. Ini dapat dicapai dengan berbagai cara:
Antarmuka:
Jenis kustom:
Operator cor:
Jenis objek literal:
sumber