Replace
挑战
实现 Replace<S, From, To>
将字符串 S
中的第一个子字符串 From
替换为 To
。
例如:
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;
评论