Estou tentando iterar sobre os valores de uma propriedade usando {#each ...} e tenho duas tipificações (este é um projeto TypeScript) em meu componente 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}
Eu esperaria que o tipo de opção em cada instrução fosse Options | OptionsGroup
mas o VS Code está me dando um erro dizendo:
Argumento do tipo 'Opções | OptionsGroup 'não pode ser atribuído ao parâmetro do tipo' ArrayLike <{text: string; valor ?: string; }> '.
Não tenho certeza do que exatamente está errado, já que as tarefas de compilação e desenvolvimento estão funcionando bem, sem erros, só parece ser um problema com o VS Code.
Sistema:
Eu também encontrei um bug estranho com {#each}
.
Menor reprodução possível:
<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, executando o plugin mais recente. Tenho um pressentimento de que está um tanto relacionado a esse problema.
@dkzlv é # 619
Temo que não seja possível consertar do nosso lado, parece que é um problema do TypeScript. Você obteria o mesmo erro ao fazer isso:
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
aquela função each
é basicamente o que é usado para verificar o tipo do bloco each
. Não encontrei uma maneira de silenciar o erro sem perder a segurança de digitação.
Você pode fazer isso em vez disso. Acho que tive esse erro de digitação antes e o fiz funcionar tentando alguma combinação aleatória 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}
Editar:
Observe que esses dois tipos não são iguais, mas provavelmente você não se preocupa com a diferença na maioria das vezes. Se você se importar, provavelmente precisará escrever algum tipo de proteção personalizado para lançá-lo.
Obrigado pelo esclarecimento, eu alterei minhas tipificações conforme recomendado e isso praticamente resolveu o problema.