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