J'essaie d'itérer sur une valeur de propriétés en utilisant {#each ...}, et j'ai deux typages (c'est un projet TypeScript) dans mon composant 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}
Je m'attendrais à ce que le type d'option dans chaque instruction soit Options | OptionsGroup
mais VS Code me donne une erreur en disant:
Argument de type 'Options | OptionsGroup 'n'est pas attribuable au paramètre de type' ArrayLike <{text: string; valeur?: chaîne; }> '.
Je ne suis pas sûr de ce qui ne va pas exactement car les tâches de construction et de développement fonctionnent correctement sans aucune erreur, cela ne semble être qu'un problème avec VS Code.
Système:
J'ai également trouvé un bug étrange avec {#each}
.
La plus petite repro possible:
<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, exécutant le dernier plugin. J'ai le sentiment instinctif qu'il est quelque peu lié à ce problème.
@dkzlv c'est # 619
Je crains que ce ne soit pas possible de résoudre de notre côté, il semble que ce soit un problème de TypeScript. Vous obtiendrez la même erreur lorsque vous faites ceci:
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
cette fonction each
est essentiellement ce qui est utilisé pour vérifier le type du bloc each
. Je n'ai pas trouvé de moyen de faire taire l'erreur sans perdre la sécurité du type.
Vous pouvez le faire à la place. Je pense que j'ai déjà eu cette erreur de typographie et que cela fonctionne en essayant une combinaison aléatoire 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}
Éditer:
Il est à noter que ces deux types ne sont pas les mêmes, mais que vous ne vous souciez probablement pas de la différence la plupart du temps. Si vous vous en souciez, vous devrez probablement écrire une protection de type personnalisée pour la transtyper.
Merci pour la clarification, j'ai modifié mes typages comme recommandé et cela a à peu près résolu le problème.