TypeScript: Membuat array wadah yang diketik kosong

184

Saya membuat game logika sederhana yang disebut "Three of a Crime" di TypeScript.

Ketika mencoba untuk mengalokasikan array yang diketik dalam TypeScript, saya mencoba melakukan sesuatu seperti ini:

var arr = Criminal[];

yang memberi kesalahan "Periksa format istilah ekspresi".

juga mencoba melakukan ini

var arr : Criminal = [];

dan ini menghasilkan "tidak dapat mengubah [] menjadi 'Kriminal'

apa cara 'TypeScript' untuk melakukan ini?

darethas
sumber

Jawaban:

168

Jawaban yang ada melewatkan opsi, jadi inilah daftar lengkap:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Menentukan tipe secara eksplisit adalah solusi umum untuk setiap kali inferensi tipe gagal untuk deklarasi variabel.

  2. Keuntungan menggunakan pernyataan tipe (kadang-kadang disebut gips, tetapi sebenarnya bukan gips dalam TypeScript) berfungsi untuk ekspresi apa pun, sehingga dapat digunakan bahkan ketika tidak ada variabel yang dideklarasikan. Ada dua sintaks untuk pernyataan tipe, tetapi hanya yang terakhir yang akan bekerja dalam kombinasi dengan JSX jika Anda peduli tentang itu.

  3. Menggunakan konstruktor Array adalah sesuatu yang hanya akan membantu Anda dalam kasus penggunaan khusus ini, tetapi yang menurut saya pribadi paling mudah dibaca. Namun, ada sedikit dampak kinerja saat runtime *. Juga, jika seseorang cukup gila untuk mendefinisikan ulang konstruktor Array, artinya bisa berubah .

Ini masalah preferensi pribadi, tetapi saya menemukan opsi ketiga yang paling mudah dibaca. Dalam sebagian besar kasus kerugian yang disebutkan akan diabaikan dan keterbacaan adalah faktor yang paling penting.

*: Fakta menyenangkan; pada saat penulisan perbedaan kinerja adalah 60% di Chrome, sementara di Firefox tidak ada perbedaan kinerja yang terukur.

Thorarin
sumber
60% ?? : O Itu liar
Max Coplan
239

Masalah pra-pengalokasian array yang diketik dengan benar dalam TypeScript agak dikaburkan karena sintaks literal array, jadi itu tidak intuitif seperti yang saya pikir pertama kali.

Cara yang benar adalah

var arr : Criminal[] = [];

Ini akan memberi Anda array yang diketik dengan benar, disimpan di variabel 'arr'

Semoga ini bisa membantu orang lain!

darethas
sumber
20

Saya tahu ini adalah pertanyaan lama tetapi saya baru-baru ini menghadapi masalah serupa yang tidak dapat diselesaikan dengan cara ini, karena saya harus mengembalikan array kosong dari tipe tertentu.

Saya punya

return [];

di mana []adalah Criminal[]jenis.

Baik return: Criminal[] [];tidak return []: Criminal[];bekerja untuk saya.

Pada pandangan pertama saya memecahkannya dengan membuat variabel yang diketik (seperti yang Anda laporkan dengan benar) tepat sebelum mengembalikannya, tetapi (saya tidak tahu bagaimana mesin JavaScript bekerja) itu dapat membuat overhead dan itu kurang dapat dibaca.

Untuk ketelitian saya akan melaporkan solusi ini dalam jawaban saya juga:

let temp: Criminal[] = [];
return temp;

Akhirnya saya menemukan casting typeScript, yang memungkinkan saya untuk menyelesaikan masalah dengan cara yang lebih ringkas dan mudah dibaca (dan mungkin efisien):

return <Criminal[]>[];

Semoga ini bisa membantu pembaca di masa depan!

Fylax
sumber
1

Untuk penggunaan akses publik seperti di bawah ini:

public arr: Criminal[] = [];
rk13
sumber