ReplaceAll
Завдання
Реалізувати 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;
Коментарі