Trim Right

Challenge

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

For example:

type Trimed = TrimRight<"   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, wobei wir ein Leerzeichen / Umbruch am rechten Ende der Zeichenkette erwarten. Finden wir eine Zeichenkette, die als rechte Zeichen ein Leerzeichen / Umbruch hat, so rufen wir den Typ rekursiv mit dem anderen, vorderen 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  `   H: `  Test `
// 2.Lauf ` Test `    H: `  Test`
// 3.Lauf ` Test`  => es kann kein 'H' infert werden => Fertig
type InvalidCharacters = "\t" | "\n" | " ";
type TrimRight<S extends string> = S extends `${infer H}${InvalidCharacters}`
  ? TrimRight<H>
  : S;

References