Replace
Завдання
Реалізувати тип Replace<S, From, To> який замінить рядок From рядком To у
даному рядку S.
Приклад:
type replaced = Replace<"types are fun!", "fun", "awesome">; // expected to be 'types are awesome!'
Розв’язок
На вході ми маємо рядок S, в якому ми маємо знайти збіг з From і замінити
його на To. Це означає, що нам потрібно розділити наш рядок на три частини та
виокремити кожну з них.
З цього й розпочнемо. Ми виділимо ліву частину рядка, поки не знайдено From,
власне, From та третім шматком те, що буде справа від нього:
type Replace<
S,
From extends string,
To,
> = S extends `${infer L}${From}${infer R}` ? S : S;
Після цього, ми маємо виокремлений підрядок From та ті частини, що його
оточують. Тож, ми можемо повернути новий шаблонний літерал з’єднавши частини та
замінивши збіг:
type Replace<
S,
From extends string,
To extends string,
> = S extends `${infer L}${From}${infer R}` ? `${L}${To}${R}` : S;
Рішення працює без проблем, окрім випадку, коли From – порожній рядок. В
такому разі TypeScript не виокремить частини. Виправимо це, додавши обробку
крайнього випадку з порожнім рядком:
type Replace<
S extends string,
From extends string,
To extends string,
> = From extends ""
? S
: S extends `${infer L}${From}${infer R}`
? `${L}${To}${R}`
: S;
Коментарі