Trim Left

Challenge

Implement TrimLeft<T> which takes an exact string type and returns a new string with the whitespace beginning removed.

For example

type trimed = TrimLeft<"  Hello World  ">; // expected to be 'Hello World  '

Solution

Wenn wir mit Template-Strings in Typen arbeiten müssen, sollten Template Literal Types verwenden. Sie ermöglichen die Modellierung der Zeichenketten im Typsystem.

Wir laufen mittels Template Literal Types über den String-Typ der übergeben wurde. Ist das aktuelle Zeichen dabei ein Leerzeichen, so rufen wir den Typ rekursiv mit dem anderen, restlichen Teil der Zeichenkette auf, bis wir das erste alphabetische Zeichen finden. Alle Zeichen, die invalide sind, legen wir in einem Hilfstypen InvalidCharacters ab.

// 1.Lauf `  Test`   First: ` `, Last: ` Test`
// 2.Lauf ` Test`    First: ` `, Last: `Test`
// 3.Lauf `Test`     First: `T`, Last: `est` => Fertig
type LookUp<T, U extends string> = T extends { type: U } ? T : never;
type InvalidCharacters = " " | "\n" | "\t";
type TrimLeft<S extends string> = S extends `${infer First}${infer Last}`
  ? First extends InvalidCharacters
    ? TrimLeft<Last>
    : S
  : S;

Alternativ kann man auch bereits die Lösung auch folgend schreiben, indem man angibt, dass das erste inferierte Zeichen auch ein ungültiges Zeichen sein muss. Damit spart man sich eine separate Prüfung hierauf.

type InvalidCharacters = " " | "\n" | "\t";
type TrimLeft<S extends string> =
  S extends `${infer First extends InvalidCharacters}${infer Last}`
    ? TrimLeft<Last>
    : S;

References