AnyOf

Challenge

Implement Python liked any function in the type system. A type takes the Array and returns true if any element of the Array is true. If the Array is empty, return false.

For example:

type Sample1 = AnyOf<[1, "", false, [], {}]>; // expected to be true.
type Sample2 = AnyOf<[0, "", false, [], {}]>; // expected to be false.

Solution

Zur Lösung dieses Problems ist es hilfreich, erstmal alle Falsy-Werte als separaten Typ zu definieren:

type Falsy =
  | false
  | 0
  | ""
  | []
  | { [P in PropertyKey]: never }
  | undefined
  | null;

Anschließend kann man wieder mittels infer in konditionellen Typen über den Array laufen und für jedes Element prüfen, ob es sich um ein true-Wert handelt. Falls nicht, wird der Typ rekursiv so lange aufgerufen, bis man das Ende des Arrays erreicht und damit alle Element geprüft hat.

type AnyOf<T extends readonly any[]> = T extends [infer H, ...infer T]
  ? H extends Falsy
    ? AnyOf<T>
    : true
  : false;

References