Replace
Challenge
Implement Replace<S, From, To> which replace the string From with To once
in the given string S.
For example:
type replaced = Replace<"types are fun!", "fun", "awesome">; // expected to be 'types are awesome!'
Solution
We have an input string S where we need to find a match for From and replace
it with To. It means that we need to split our string in three parts and infer
each of them.
Let us start with it. We infer the left part of the string until From is
found, the From itself and everything after it as a right part:
type Replace<
S,
From extends string,
To,
> = S extends `${infer L}${From}${infer R}` ? S : S;
Once the inferring successful, From is found and we have parts of the
surrounding string. So we can return a new template literal type by constructing
its parts and replacing the match:
type Replace<
S,
From extends string,
To extends string,
> = S extends `${infer L}${From}${infer R}` ? `${L}${To}${R}` : S;
Solution works with no issues, except the case when the From is an empty
string. Here, TypeScript will not infer the parts. We fix it by adding an edge
case for an empty string:
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;
Comments