symbolの部分型である必要があります。型として定義されており、以下のように活用できます。symbol及びそれらのリテラル型で、オブジェクトのプロパティであるTには任意の型が代入可能です。"stores"}00014-first-of-array配列の最初の要素を型として返す型です。typesを理解しておく必要があります。typesは見た目の通り、三項演算子を型定義において利用するものです。trueだった場合に、型がAに決まり、falseだった場合にBに決まります。三項演算子とほぼ同じなので直感的にも理解しやすいかと思います。infer本題のinferです。inferは日本語にすると「推論」になりますが、その名の通り推論した型を活用するための技術です。typesと合わせて活用します。説明だけだと分かりにくいのでまず公式ドキュメントに出ている例を見て、その後説明していきます。Type;Genericsでは、引数で渡した型を使い回す形になりますが(今回のTypeのように)、inferでは動的に型の値を変形させて活用することが可能です。なんらかの要素を持った配列だった場合、その要素の型を返します。stringこのように、inferを活用することでインデックスによるアクセスなどで要素の型に直接アクセスすることなく、推論によって型の値を得ることができるようになります。ここまで見るとわかるように、最初の回答はinferを使わずに以下のように書き換えることも可能です。neverまた、ややこしいことはせずこれでもOKです。触れてきているので、今更感もありますが、インデックスによるアクセスで特定のプロパティの型にアクセスすることが可能です。プロパティにアクセスしてその型を得ています。typesの条件がユニオン型のそれぞれに対して適用される機能です。関数だけでなく、型でも再帰を活用することが可能です。最初、私の回答は以下のように、あくまでもテストケースをクリアするためのコードになってしまっていたのですが、回答例に載せたように再帰を使うとより深くネストされたPromiseがあっても適切に型を取り出すことが可能です。typesなので説明は割愛します。typesとgenericsにおける型引数の制約だけなので、説明は割愛します。typesしれっとすでに登場しているのですが、TypeScriptにおいては配列やオブジェクトの値などを展開するときに活用するスプレッド構文を型として活用することが可能です。typesという機能です。公式ドキュメントの中でも、concatの例が出されていました。あとは、genericsにおける型引数の制約を活用して引数として受け取る型を配列に制限すればOKです。falsePlayground_00898_includes一気に難しくなった感があります。やっていることが同じということはわかったのですが、関数型の部分がなぜワークしているのかの理解にかなり手こずりました。要は、再帰的に配列の要素と、Uが一致するかをチェックして一致したらtrue、一致しなかったら配列の次の要素で確認。何も引数を渡していないのに何が確認されているんだ。いう疑問がなかなか解消できませんでした。等しいということを確認するために、関数型を作成しています。変えてもワークします。0))これならば、さらに短縮して以下のように書き換えても良いのでは?と思ってしまいます。成り立ってしまいダメです。同一性をより厳密に比較するために回りくどい比較方法を取っているのでした。(これ自分で思いつくことができる気がしない。U]Playground_03057_pushなぜか急に易化。typesの組み合わせです。...T]Playground_03060_unshiftPushの逆で先頭に追加するだけです。[]Playground_03312_parameters使う機能はこれまでと同じです。書く必要があることに気づくのが少し難しかったです。withGatsby。