IndexOf

Challenge

Implement the type version of Array.indexOf, indexOf<T, U> takes an Array T, any U and returns the index of the first U in Array T.

type Res = IndexOf<[1, 2, 3], 2>; // expected to be 1
type Res1 = IndexOf<[2, 6, 3, 8, 4, 1, 7, 3, 9], 3>; // expected to be 2
type Res2 = IndexOf<[0, 0, 0], 2>; // expected to be -1

Solution

Zur Lösung dieses Problems benötigen wir einen Akkumulator in Form einer Tupel, um den aktuellen Index zwischenzuspeichern. Für jede Iteration / Aufruf des Typen erweitern wir die Tupel um ein Element. Außerdem extrahieren wir immer das momentan erste Element der Tupel und prüfen, ob dieses dem Argument U entspricht. Falls ja, geben wir die Länge des Akkumulators zurück.

type IndexOf<T extends any[], U, Index extends 1[] = []> = T extends [
  infer H,
  ...infer T
]
  ? Equal<H, U> extends true
    ? Index["length"]
    : IndexOf<T, U, [...Index, 1]>
  : -1;

References