Language-tools: Setiap Masalah Pengetikan Blok

Dibuat pada 3 Jan 2021  ·  5Komentar  ·  Sumber: sveltejs/language-tools

Saya mencoba mengulangi nilai properti dengan menggunakan {#each ...}, dan saya memiliki dua pengetikan (ini adalah proyek TypeScript) di komponen Svelte saya.

<script lang="ts">
    import Transition from './Transition/Transition.svelte';

    type Options = { text: string, value?: string }[];
    type OptionsGroup = Options[];

    export let options: Options | OptionsGroup = [];
</script>

{#each options as option}
    <div>example</div>
{/each}

Saya mengharapkan jenis opsi di setiap pernyataan menjadi Options | OptionsGroup tetapi VS Code memberi saya kesalahan yang mengatakan:

Argumen bertipe 'Options | OptionsGroup 'tidak dapat ditetapkan ke parameter jenis' ArrayLike <{text: string; nilai ?: string; }> '.

Saya tidak yakin apa sebenarnya yang salah karena tugas build dan dev berfungsi dengan baik tanpa kesalahan sama sekali, tampaknya hanya ada masalah dengan VS Code.

Sistem:

  • OS: Manjaro (Linux)
  • IDE: VSCode
  • Plugin / Paket: Svelte untuk VSCode
bug question

Semua 5 komentar

Saya juga menemukan bug aneh dengan {#each} .

Repro sekecil mungkin:

<script lang="ts">
  let data: { name: string } | null = null,
    someArr = [1, 2, 3];
</script>

{#if data}
  <!-- Works fine -->
  {data.name}
  {#each someArr as _}
    <!-- Highlights an error! -->
    {data.name}
  {/each}
{/if}

Mac, VS Code, menjalankan plugin terbaru. Saya punya firasat itu agak terkait dengan masalah ini.

Proof of bug

@dkl itu # 619

Saya khawatir ini tidak mungkin diperbaiki di pihak kami, tampaknya ini adalah masalah TypeScript. Anda akan mendapatkan kesalahan yang sama saat melakukan ini:

function each<T>(
    array: ArrayLike<T>, // or T[], doesnt matter for the error
    callbackfn: (value: T, index: number) => any
): any{ /* doesnt matter */ };

each(options, a => a); // The same TS error

bahwa fungsi each pada dasarnya adalah apa yang digunakan untuk memeriksa-ketik each -block. Saya tidak menemukan cara untuk membungkam kesalahan tanpa kehilangan keamanan tipe.

Anda dapat melakukan ini sebagai gantinya. Saya rasa saya memiliki kesalahan ketikan ini sebelumnya dan berhasil dengan mencoba beberapa kombinasi acak lol

<script lang="ts">
  type Option = { text: string, value?: string };
  type OptionsGroup = Option[];

  export let options: Array<Option | OptionsGroup> = [];
</script>

{#each options as option}
  <div>example</div>
{/each}

Edit:
Tercatat kedua jenis ini tidak sama, tetapi Anda mungkin tidak terlalu peduli dengan perbedaannya hampir sepanjang waktu. Jika Anda benar-benar peduli, Anda mungkin perlu menulis beberapa pelindung tipe khusus untuk mentransmisikannya.

Terima kasih atas klarifikasinya, saya telah mengubah pengetikan saya sebagai rekomendasi dan itu telah cukup banyak menyelesaikannya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat