Language-tools: Chaque problème de frappe de bloc

Créé le 3 janv. 2021  ·  5Commentaires  ·  Source: sveltejs/language-tools

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:

  • Système d'exploitation: Manjaro (Linux)
  • IDE: VSCode
  • Plugin / Package: Svelte pour VSCode
bug question

Tous les 5 commentaires

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.

Proof of bug

@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.

Cette page vous a été utile?
0 / 5 - 0 notes