First of Array

Challenge

Die intuitive und naheliegendste erste Lösung ist es, einfach über einen Lookup-Type das erste Element zu bestimmen:

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

Diese Lösung ist allerdings nicht für alle Fälle geeignet, da z. B. ein leerer Array kein Element enthält und man somit nicht auf das erste Element zugreifen kann. Man muss daher erst prüfen, ob es sich um ein Array mit einer Mindestlänge von 1 handelt, um das erste Element zurückgeben zu können.

Man kann hierfür einfach einen Lookup-Type des Arrays verwenden, um die Länge zu erhalten. Sollte diese 0 sein, wird never zurückgegeben, was eine Zuweisung verhindert.

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

Eine weitere Lösung ist es, statt den Lookup-Type ‘length’ zu nutzen, einfach direkt auf einem leeren Array zu prüfen:

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

Falls man sich bereits mit dem Inferen von Werten in konditionellen Typen auskennt, kann man auch auf folgende Lösung kommen:

type First<T extends any[]> = T extends [infer First, ...infer Rest]
  ? First
  : never;

References