Language-tools: Проблема с вводом каждого блока

Созданный на 3 янв. 2021  ·  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} .

Наименьшее возможное воспроизведение:

<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 это

Боюсь, что это невозможно исправить с нашей стороны, похоже, это проблема 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. Я не нашел способа заглушить ошибку без потери безопасности типов.

Вы можете сделать это вместо этого. Я думаю, что у меня раньше была эта ошибка машинописного текста, и я получил ее, попробовав какую-то случайную комбинацию 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}

Редактировать:
Отметил, что эти два типа не одно и то же, но вы, вероятно, большую часть времени не заботитесь о разнице. Если вам все равно, вам, вероятно, нужно написать некоторую защиту пользовательского типа, чтобы ее преобразовать.

Спасибо за разъяснения, я внес поправки в свой набор текста как рекомендуемые, и это в значительной степени решило проблему.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги