Я пытаюсь перебирать значения свойств с помощью {#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.
Система:
Еще я обнаружил странную ошибку с {#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, под управлением последней версии плагина. Я чувствую, что это как-то связано с этой проблемой.
@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}
Редактировать:
Отметил, что эти два типа не одно и то же, но вы, вероятно, большую часть времени не заботитесь о разнице. Если вам все равно, вам, вероятно, нужно написать некоторую защиту пользовательского типа, чтобы ее преобразовать.
Спасибо за разъяснения, я внес поправки в свой набор текста как рекомендуемые, и это в значительной степени решило проблему.