Split

Challenge

The well known split() method splits a string into an array of substrings by looking for a separator, and returns the new array. The goal of this challenge is to split a string, by using a separator, but in the type system!

For example:

type result = Split<"Hi! How are you?", " ">; // should be ['Hi!', 'How', 'are', 'you?']

Solution

Zur Lösung dieses Problems können wir wieder infer in konditionellen Typen nutzen, um ein Zeichen nach dem anderen aus der Zeichenkette zu extrahieren, die ein bestimmtes Muster, in diesem Fall (Zeichen)(Separator)(Restliche Zeichen), nutzt.

Zusätzlich müssen wir zu Beginn der Typdeklaration zwei Randfälle abfangen, bei denen string oder direkt der Separator für S eingegeben werden.

type Split<
  S extends string,
  SEP extends string,
  Acc extends string[] = []
> = string extends S
  ? string[]
  : S extends SEP
  ? Acc
  : S extends `${infer H}${SEP}${infer Rest}`
  ? Split<Rest, SEP, [...Acc, H]>
  : [...Acc, S];

References