Language-tools: 各ブロック入力の問題

作成日 2021年01月03日  ·  5コメント  ·  ソース: sveltejs/language-tools

{#each ...}を使用してプロパティ値を反復処理しようとしていますが、Svelteコンポーネントに2つの型(これはTypeScriptプロジェクトです)があります。

<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と思いますが、VSCodeで次のようなエラーが発生します。

タイプの引数 'オプション| OptionsGroup 'はタイプ' ArrayLike <{text:string;のパラメーターに割り当てることができません。 値?:文字列; }> '。

ビルドタスクと開発タスクがエラーなしで正常に機能しているため、正確に何が問題になっているのかわかりません。これはVSCodeの問題のようです。

システム:

  • OS:Manjaro(Linux)
  • IDE:VSCode
  • プラグイン/パッケージ:VSCode用のSvelte
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それは#619です

これは私たちの側では修正できないのではないかと心配しています。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ブロックのタイプチェックに使用されるものです。 型安全性を失うことなくエラーを沈黙させる方法を見つけられませんでした。

代わりにこれを行うことができます。 私は以前にこのタイプスクリプトエラーがあったと思います、そしてそれはいくつかのランダムな組み合わせを試すことによって機能しました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}

編集:
これらの2つのタイプは同じではないことに注意してください。ただし、ほとんどの場合、違いは気にしないでしょう。 気にする場合は、キャストするためにカスタムタイプのガードを作成する必要があります。

明確化していただきありがとうございます。推奨どおりに入力を修正しました。これでほぼ解決しました。

このページは役に立ちましたか?
0 / 5 - 0 評価