Tuple Filter

Challenge

Implement a type FilterOut<T, F> that filters out items of the given type F from the tuple T.

For example,

type Filtered = FilterOut<[1, 2, null, 3], null>; // [1, 2, 3]

Solution

Zur Lösung dieser Herausforderung muss man lediglich über die Tupel laufen (mittels infer), und für jedes Element prüfen, ob es sich um den Typ des zweiten Eingabewertes handelt. Wichtig ist hier, dass man den beim Vergleich beide Parameter in eine Klammer packt, um somit das distributive Verhalten in konditionellen Typen zu unterbinden, da sonst das Ergebnis anders ausfällt.

type FilterOut<T extends any[], F, Acc extends any[] = []> = T extends [
  infer H,
  ...infer Rest
]
  ? [H] extends [F]
    ? FilterOut<Rest, F, Acc>
    : FilterOut<Rest, F, [...Acc, H]>
  : Acc;

References

— - Conditional Types