Replace
Проблема
Реализовать Replace<S, From, To>
который заменяет искомую строку From
в S
на строку To
. Например:
type replaced = Replace<"types are fun!", "fun", "awesome">; // expected to be 'types are awesome!'
Решение
Начнем с того, что разобъем строку на три части: подстрока до From
, сама
подстрока From
и подстрока после From
. Используя условные типы этого легко
добиться:
type Replace<
S,
From extends string,
To,
> = S extends `${infer L}${From}${infer R}` ? S : S;
Как только TypeScript вывел типы, это означает что From
найден и окружающие
его части попадают в тип параметры L
и R
. Вернём новый строчный тип литерал,
который создаем из этих выведенных кусков и строки To
.
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;
Комментарии