Capitalize Words

Challenge

Implement CapitalizeWords<T> which converts the first letter of each word of a string to uppercase and leaves the rest as-is.

For example

type capitalized = CapitalizeWords<"hello world, my friends">; // expected to be 'Hello World, My Friends'

Solution

Zuerst benötigen wir eine Hilfsfunktion, die bestimmt, ob ein Zeichen auch alphabetischer Natur ist, damit wir in diesem Fall nur die alphabetischen Zeichen vergrößern.

// IsCharNonAlpabletical<'🤣'> => true
// IsCharNonAlpabletical<'t'> => false
type IsCharNonAlpabletical<T extends string> = Lowercase<T> extends Uppercase<T>
  ? true
  : false;

Der finale Typ erhält drei Parameter, von denen nur einer ergeben wird. Die anderen dienen als Variablen zum Speichern von Werten

  1. Die Zeichenkette, den man anpassen soll
  2. Die vorherige Zeichenkette, initial ist diese leer
  3. Das Ergebnis als Zeichenkette, auch initial leer

Die Logik ist simpel: Sobald das vorherige Zeichen ein nicht-alphabetisches Zeichen war, wird das aktuelle Zeichen großgeschrieben (u.a. bei Leerzeichen, Emojis) Das aktuelle Zeichen sowie der Rest der Zeichenkette lassen wir inferen, und rufen den Typ so lange rekursiv auf, bis wir einmal durch die Zeichenkette gelaufen sind. Dann geben wir den in (3) gespeicherten, neuen String zurück.

type CapitalizeWords<
  S extends string,
  Prev extends string = "",
  Result extends string = ""
> = S extends `${infer A extends string}${infer B extends string}`
  ? CapitalizeWords<
      B,
      A,
      `${Result}${IsCharNonAlpabletical<Prev> extends true ? Uppercase<A> : A}`
    >
  : Result;

References