Kod skrip taip yang tidak mengambil kira kemungkinan elemen tatasusunan kembali tidak ditentukan
P粉824889650
P粉824889650 2023-08-24 12:15:44
0
2
642
<p>Kod berikut dihantar dalam penyemak jenis Typescript (v2.9.1), tetapi membuang <code>TypeError</code> </p> <pre class="brush:php;toolbar:false;">Item antara muka { id: string } senarai const: Item[] = [{ id: 'a' }, { id: 'b' }]; item const = senarai[3]; // Jenis: Item const itemId = item.id // Jenis: string</pre> <p>Memandangkan bahawa mengakses elemen dalam tatasusunan yang ditaip mungkin sentiasa mengembalikan <kod>tidak ditentukan</kod>, <kod>item</kod> mestilah <kod>item: Item |. , yang akan memaksa anda melakukan semakan batal, bukan? </p> <p>Apa yang lebih mengejutkan saya ialah kod berikut juga melepasi semakan jenis: </p> <pre class="brush:php;toolbar:false;">const item2: Item | undefined = list[3]; const item2Id = item2.id;</pre> <p>Walaupun menghantar nilai pulangan menyebabkan semakan jenis gagal: </p> <pre class="brush:php;toolbar:false;">const item3 = list[3] as Item undefined; const item3Id = item3.id; // [ts] Objek mungkin 'tidak ditentukan'.</pre> <p>Mencipta fungsi pengakses yang ditaip secara eksplisit juga boleh menangkap situasi <kod>tidak ditentukan</kod> <pre class="brush:php;toolbar:false;">const getItem1 = (index: number, items: Item[]): Item undefined => const item3 = getItem1(3, senarai); const item3Id = item3 && item3.id;</pre> <p>Adakah ini pengehadan TypeScript yang diketahui? Adakah terdapat sebarang corak atau perpustakaan yang disyorkan untuk menangani situasi ini? </p>
P粉824889650
P粉824889650

membalas semua(2)
P粉194541072

Ini adalah tingkah laku yang disengajakan. Lihat perbincangan panjang tentang isu ini pada repositori TypeScript GitHub

strictNullChecks anda ditutup;

P粉330232096

Kemas kini TS 4.1:

TypeScript 4.1 memperkenalkan --noUncheckedIndexedAccess编译器标志,实现了在microsoft/TypeScript#13778中提出的建议,以考虑这种情况下的undefined。请注意,该功能不会作为--strict编译选项集的一部分启用,并且被称为“严格的索引签名”,因为它会在程序员可能不希望或期望的情况下发出关于undefined amaran.


Jawab sebelum TS4.1:

Anda telah mendapati bahawa tandatangan indeks tidak menambah | undefined pada jenis elemen seperti atribut pilihan. Terdapat cadangan untuk mencipta pilihan pengkompil untuk mencapai ini pada microsoft/TypeScript#13778. Anda boleh membaca komen dalam cadangan itu; mereka menghubungkan kepada soalan lain, tetapi konsensusnya ialah kadar ralat yang tinggi hampir menjadikannya tidak berguna.

juga menyebut bahawa anda boleh menambah | undefined secara manual pada jenis elemen:

const list: (Item | undefined)[] = [{ id: 'a' }, { id: 'b' }];

Ini akan berfungsi seperti yang anda jangkakan tanpa menjejaskan keseluruhan bahasa.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan