type-challenges/README.md at main · type-challenges/type-challenges
配列Tを受け取って、その配列の最初の要素の型をとるようなジェネリクスFirst<T>を実装する。
type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]
type head1 = First<arr1> // expected to be 'a'
type head2 = First<arr2> // expected to be 3
Conditional Typesを利用して、要素がある場合には1番目の要素の型を返すようにする
type First<T extends any[]> = T extends [] ? never : T[0]
別解を見ていたら、inferを使っているケースもありました
type First<T extends any[]> = T extends [infer first, ...infer _Rest] ? first : never
inferキーワードを使ってfirstという名前で配列の1番目の要素の型を推論している。...infer _Restの部分はrest parametersを使って、配列の残りの要素の方を_Restに押し込んでいる。といっても今回は使用しない型なので_始まりにしているっぽいです。
type IsString<T> = T extends string ? true : false
infer Uの形式で推論した型情報をUとして扱うことができるようになる。type SecondArg<F> = F extends (a: number, b: infer B) => string ? B : never
Fが、number型の第1引数と何かしらの第2引数を持ち、stringを返す関数である場合、第2引数の型をinferで推論して返すというもの。indexed access types, also called lookup types
今日は条件分岐型を覚えました。1週間前くらいまではジェネリクス型見たら「うわっ」って感じだったんですけど、だいぶ慣れてきました。(感覚としてはギター始めたての頃のBm7-5に近い)
手元にオライリーのプログラミングTypeScriptをおいてリファレンス的に使っているんですが、第4版が2021年発行なので、ちょっと情報が古いかもと思い始めています。 もう一冊くらい手元においておいてもよいかなあ。