ホームページ  >  に質問  >  本文

エントリがタプルごとに異なる可能性があるタプルの配列に型を割り当てるにはどうすればよいですか?

function foo(args) {...} があるとします。args は、タプル内のエントリが同じ型 (つまり [T,T]) ですが、 タプル にわたる エントリは 任意に変更される可能性があります (つまり、[[T,T], [U,U ],[ V、V]])。例えば:### リーリー

タプル内の型が一致しないとコンパイル時に型エラーがスローされるようにするには、

fooargs 引数をどのように入力すればよいですか?例えば:### リーリー 型エラーをインラインで表示できない場合は、関数呼び出し全体が間違っていることも許容されます。


付録

: [SomeType, T]型の2タプルを使用することは可能ですか(つまり、2番目のエントリは最初のエントリと同じ型である必要があります) )、ただし、T はタプル [[SomeType, T],[SomeType, U],[SomeType, V]]? 間で異なる場合があります。 ああああ

P粉068486220P粉068486220409日前526

全員に返信(2)返信します

  • P粉948258958

    P粉9482589582023-09-07 19:10:47

    これは、stringnumber、または boolean 値##を受け入れる row<代码> の型を作成するだけで実現できると思います。 #。

    タイプ行 = 文字列[] |ブール値[]|数値[]

    これで、この型を

    foo 関数の args 引数に割り当てることができます。 リーリー

    この型定義では、行内の要素の型が一致しない

    foo に引数を指定すると、Typescript はエラーをスローします。

    ここは遊び場です

    リンク.

    返事
    0
  • P粉136356287

    P粉1363562872023-09-07 13:38:15

    これを実現するには、 汎用 配列と マッピング タイプ を使用して配列の要素をマップする必要があります。配列は長さ 2 のタプルの配列である必要があることがわかっているため、タプル内の最初の項目のジェネリック パラメーターを推測し、2 番目の項目を同じ型にします。ジェネリック パラメーターの型を取得するには、 を使用して キーワードを推測する必要があります。これを機能させるために使用されるジェネリック型を正確に (または少なくとも同様の形状の型) 知る必要があることに注意してください。この場合、それは Variable:

    です。 リーリー

    これだけのように思えるかもしれませんが、次の配列の型を見てみましょう:

    リーリー

    ご覧のとおり、型は arr にあるものとまったく同じではありません。コンパイラは型を拡張して、配列要素を変更できるようにします。配列が読み取り専用であることをコンパイラに知らせるには、const アサーション:

    を使用する必要があります。 リーリー

    これでうまくいきました。これは、foo に渡される配列を読み取り専用に設定する必要があることを意味します。また、読み取り専用配列は、渡してみた場合に得られる可変配列のスーパーセットであるためです。読み取り専用配列を配列に変換すると、エラーが発生します:

    リーリー

    したがって、foo 内のすべての配列型を読み取り専用に更新します。配列は 2 次元であるため、内部配列も読み取り専用になり、配列の制約は読み取り専用配列の読み取り専用配列である必要があることに注意してください。 リーリー ###テスト:### リーリー

    しかし、まだ問題がいくつかあります。たとえば、タプルの最初の要素が

    Variable

    である場合、2 番目のパラメータも数値ではなく 7<7> でなければならないことを意味します。つまり、数値である 7 のプリミティブを取得する必要があるということです。これは、私の type-samurai オープン ソース プロジェクトの ToPrimitive ユーティリティ タイプを使用して実行できます。 リーリー 更新機能: リーリー もう 1 つの問題は、現在の foo

    実装で推論された型が

    number[]

    である場合、読み取り専用の配列が許可されないことです。 リーリー 修正は非常に簡単です。推論された型が配列であるかどうかを確認し、その要素型を取得して、読み取り専用の ElementType[] をタプルの 2 番目のパラメーターとして渡します。 リーリー ###テスト:### リーリー 厄介な点は、どこでも const アサーション

    を使用する必要があることです。 Typescript

    5.0 では、

    const 型パラメータ

    なので、

    const アサーション

    : を回避できます。 リーリー 残念ながら、T を型として直接割り当てるのではなく、パラメーターを使用して何かを行うため、これらを使用することはできません。 リーリー つまり、現時点では、const アサーション が期待どおりに動作することを保証する唯一の方法です。

    プレイグラウンドへのリンク

    返事
    0
  • キャンセル返事