cari

Rumah  >  Soal Jawab  >  teks badan

Kod skrip taip yang tidak mengambil kira kemungkinan elemen tatasusunan kembali tidak ditentukan

<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粉824889650P粉824889650468 hari yang lalu658

membalas semua(2)saya akan balas

  • P粉194541072

    P粉1945410722023-08-25 11:31:36

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

    strictNullChecks anda ditutup;

    balas
    0
  • P粉330232096

    P粉3302320962023-08-25 11:19:47

    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.

    balas
    0
  • Batalbalas