Language-tools: كل مشكلة في الطباعة بلوك

تم إنشاؤها على ٣ يناير ٢٠٢١  ·  5تعليقات  ·  مصدر: sveltejs/language-tools

أحاول تكرار قيم الخصائص باستخدام {#each ...} ، ولدي نوعان من الكتابة (هذا مشروع TypeScript) في مكون Svelte الخاص بي.

<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}

أتوقع أن يكون نوع الخيار في كل عبارة Options | OptionsGroup لكن VS Code يعطيني خطأ يقول:

وسيطة من النوع 'خيارات | OptionsGroup 'غير قابل للتخصيص إلى معلمة من النوع' ArrayLike <{text: string؛ القيمة ؟: سلسلة. }> '.

لست متأكدًا مما يحدث بالضبط لأن مهام الإنشاء والتطوير تعمل بشكل جيد مع عدم وجود أخطاء على الإطلاق ، ويبدو أنها مشكلة في VS Code فقط.

نظام:

  • نظام التشغيل: Manjaro (Linux)
  • IDE: VSCode
  • البرنامج المساعد / الحزمة: Svelte لـ VSCode
bug question

ال 5 كومينتر

لقد وجدت أيضًا خطأً غريبًا في {#each} .

أصغر repro ممكن:

<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 ، يشغل أحدث مكون إضافي. لدي شعور داخلي بأنها مرتبطة إلى حد ما بهذه القضية.

Proof of bug

dkzlv هذا هو # 619

أخشى أن هذا ليس من الممكن إصلاحه من جانبنا ، يبدو أنها مشكلة TypeScript. ستحصل على نفس الخطأ عندما تفعل هذا:

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

هذه الوظيفة each هي أساسًا ما يتم استخدامه للتحقق من كتلة each -block. لم أجد طريقة لإسكات الخطأ دون فقدان نوع الأمان.

يمكنك القيام بذلك بدلا من ذلك. أعتقد أن لدي هذا الخطأ المطبوع على الحروف من قبل وحصلت عليه من خلال تجربة مجموعة عشوائية لول

<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}

يحرر:
لاحظ أن هذين النوعين ليسا متماثلين ، لكن ربما لا تهتم بالفرق في معظم الأوقات. إذا كنت تهتم ، فربما تحتاج إلى كتابة نوع حارس مخصص لإلقاؤه.

شكرًا لك على التوضيح ، لقد قمت بتعديل كتاباتي على النحو الموصى به وقد أدى ذلك إلى حلها إلى حد كبير.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات