課題

配列 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

解答

Lookup 型を使用して T[0] と書くことをまず思い付いたかもしれません:

type First<T extends any[]> = T[0];

しかし、ここで考慮すべきエッジケースがあります。空の配列を渡した場合、要素がない ため T[0] は期待通り動作しないのです。

そのため、配列の最初の要素にアクセスする前に、配列が空であるかどうかをチェックす る必要があります。これは TypeScript の Conditional 型 によって実現することができます。

Conditional 型の考え方はとてもシンプルです。extends の左にある型を右側の型に割 り当てることができる場合、true ブランチに入ります。そうでない場合は false ブラン チに入ります。

配列が空であるかどうかをチェックし、空である場合は何も返さず、その他の場合は配列 の最初の要素を返すようにしましょう:

type First<T extends any[]> = T extends [] ? never : T[0];

参考