Kod skrip taip yang tidak mengambil kira kemungkinan elemen tatasusunan kembali tidak ditentukan
P粉824889650
2023-08-24 12:15:44
<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>
Ini adalah tingkah laku yang disengajakan. Lihat perbincangan panjang tentang isu ini pada repositori TypeScript GitHub
strictNullChecks
anda ditutup;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:Ini akan berfungsi seperti yang anda jangkakan tanpa menjejaskan keseluruhan bahasa.