TypeScript入門 配列の先頭の要素の型を取得する方法

[string, number] であれば string を、 [boolean, string, string] であれば boolean を返すような型を作ります。

はじめに思いついたのが以下です。

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

とてもシンプルなのですがひとつ問題があります。

type T1 = First<[]> // undefined
type T2 = First<[undefined, string]> // undefined

どちらもundefinedになります。

これだと、上のように配列の先頭がundefinedなのか、それとも空配列なのかを判断できません。

そこで、以下のようにします。

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

補足

いままで知らなかったのですが、以下の二つの型は異なるのですね。

type T1 = [][number] // T1はnever
type T2 = [][0] // T2はundefined