function foo(args) {...}
があるとします。args
は、タプル内のエントリが同じ型 (つまり [T,T]
) ですが、 タプル にわたる エントリは 任意に変更される可能性があります (つまり、[[T,T], [U,U ],[ V、V]]
)。例えば:###
リーリー
foo の
args 引数をどのように入力すればよいですか?例えば:###
リーリー
型エラーをインラインで表示できない場合は、関数呼び出し全体が間違っていることも許容されます。
: [SomeType, T]型の2タプルを使用することは可能ですか(つまり、2番目のエントリは最初のエントリと同じ型である必要があります) )、ただし、T はタプル
, T],[SomeType, U],[SomeType
これは、
string
、number
、またはboolean 値##を受け入れる
row の型を作成するだけで実現できると思います。 #。タイプ行 = 文字列[] |ブール値[]|数値[]
これで、この型をfoo
この型定義では、行内の要素の型が一致しない関数の
args引数に割り当てることができます。
リーリーfoo
ここは遊び場ですに引数を指定すると、Typescript はエラーをスローします。
リンク
代码>.
これを実現するには、 汎用 配列と マッピング タイプ を使用して配列の要素をマップする必要があります。配列は長さ 2 のタプルの配列である必要があることがわかっているため、タプル内の最初の項目のジェネリック パラメーターを推測し、2 番目の項目を同じ型にします。ジェネリック パラメーターの型を取得するには、 を使用して キーワードを推測する必要があります。これを機能させるために使用されるジェネリック型を正確に (または少なくとも同様の形状の型) 知る必要があることに注意してください。この場合、それは
です。 リーリーVariable
:これだけのように思えるかもしれませんが、次の配列の型を見てみましょう:
リーリーご覧のとおり、型は arr にあるものとまったく同じではありません。コンパイラは型を拡張して、配列要素を変更できるようにします。配列が読み取り専用であることをコンパイラに知らせるには、const アサーション:
を使用する必要があります。 リーリーこれでうまくいきました。これは、
リーリーfoo
に渡される配列を読み取り専用に設定する必要があることを意味します。また、読み取り専用配列は、渡してみた場合に得られる可変配列のスーパーセットであるためです。読み取り専用配列を配列に変換すると、エラーが発生します:したがって、
しかし、まだ問題がいくつかあります。たとえば、タプルの最初の要素がfoo
内のすべての配列型を読み取り専用に更新します。配列は 2 次元であるため、内部配列も読み取り専用になり、配列の制約は読み取り専用配列の読み取り専用配列である必要があることに注意してください。 リーリー ###テスト:### リーリーVariable
である場合、2 番目のパラメータも数値ではなく
7 でなければならないことを意味します。つまり、数値である
7のプリミティブを取得する必要があるということです。これは、私の
type-samuraiオープン ソース プロジェクトの
ToPrimitive ユーティリティ タイプを使用して実行できます。 リーリー 更新機能: リーリー もう 1 つの問題は、現在の p>foo実装で推論された型が
number[]である場合、読み取り専用の配列が許可されないことです。 リーリー
を使用する必要があることです。 Typescript修正は非常に簡単です。推論された型が配列であるかどうかを確認し、その要素型を取得して、読み取り専用の ElementType[]
をタプルの 2 番目のパラメーターとして渡します。 リーリー ###テスト:### リーリー厄介な点は、どこでも
const アサーション5.0 では、
const 型パラメータなので、
const アサーション:
を回避できます。 リーリー
残念ながら、T
を型として直接割り当てるのではなく、パラメーターを使用して何かを行うため、これらを使用することはできません。 リーリー つまり、現時点では、const アサーションが期待どおりに動作することを保証する唯一の方法です。
プレイグラウンドへのリンク