type-challenges 4日目: 14-First of Array

問題 & 解答

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に押し込んでいる。といっても今回は使用しない型なので_始まりにしているっぽいです。

調べたこと

Conditional Types(条件型)

type IsString<T> = T extends string ? true : false

inferキーワード

type SecondArg<F> = F extends (a: number, b: infer B) => string ? B : never

never型

Index Accessed Types

感想

今日は条件分岐型を覚えました。1週間前くらいまではジェネリクス型見たら「うわっ」って感じだったんですけど、だいぶ慣れてきました。(感覚としてはギター始めたての頃のBm7-5に近い)

手元にオライリーのプログラミングTypeScriptをおいてリファレンス的に使っているんですが、第4版が2021年発行なので、ちょっと情報が古いかもと思い始めています。 もう一冊くらい手元においておいてもよいかなあ。