Завдання

Реалізувати ReplaceAll<S, From, To> який замінить всі збіги підрядка From на рядок To в заданому рядку S. Наприклад:

type replaced = ReplaceAll<"t y p e s", " ", "">; // expected to be 'types'

Розв’язок

Це завдання має багато спільного з Replace. Там ми замінювали збіг тільки один раз, а тут потрібно замінити всі.

Ділимо вхідний рядок S на три частини: підрядок до From, самий From и підрядок після From. Щоб вивести їх, використовуємо рядкові тип-літерали й умовні типи. Як тільки TypeScript виведе типи, він привласнить їх тип-параметрам L і R. На їх основі, повертаємо новий рядковий тип-літерал, в якому замінений From на To.

type ReplaceAll<
  S extends string,
  From extends string,
  To extends string,
> = From extends ""
  ? S
  : S extends `${infer L}${From}${infer R}`
  ? `${L}${To}${R}`
  : S;

Цей розв’язок працює тільки з одним збігом, як в Replace, але нам потрібно замінити всі. Цього можна легко досягнути, передаючи наш новий тип-літерал рекурсивно в ReplaceAll.

type ReplaceAll<
  S extends string,
  From extends string,
  To extends string,
> = From extends ""
  ? S
  : S extends `${infer L}${From}${infer R}`
  ? ReplaceAll<`${L}${To}${R}`, From, To>
  : S;

Посилання