Skip to content

Replace

约 403 字大约 1 分钟

2022-12-01

题目

Github: Replace

实现 Replace<S, From, To> 将字符串 S 中的第一个子字符串 From 替换为 To

type replaced = Replace<'types are fun!', 'fun', 'awesome'> // 期望是 'types are awesome!'

解题思路

我们可以使用 模板字面量类型 来实现这个挑战。对于字符串 S ,我们将其拆分为三个部分,并对每个部分 进行推断。

推断从字符串的左侧开始,直到找到 Form 位置,此时 S 为拆分为 FFromR 三个部分。

type Replace<S extends string, From extends string, To extends string> = 
  S extends `${infer F}${From}${infer R}` ? S : S

在找到 From 位置后,我们对 From 位置的字符串进行替换,将其替换为 To,拼接为新的字符串。

type Replace<S extends string, From extends string, To extends string> =
  S extends `${infer F}${From}${infer R}` ? `${F}${To}${R}` : S

我们也需要考虑 From 为空字符串的情况,此时我们直接返回 S

答案

type Replace<S extends string, From extends string, To extends string> = 
  From extends ''
    ? S
    : S extends `${infer F}${From}${infer R}`
      ? `${F}${To}${R}`
      : S

验证

type 
cases
= [
Expect
<
Equal
<
Replace
<'foobar', 'bar', 'foo'>, 'foofoo'>>,
Expect
<
Equal
<
Replace
<'foobarbar', 'bar', 'foo'>, 'foofoobar'>>,
Expect
<
Equal
<
Replace
<'foobarbar', '', 'foo'>, 'foobarbar'>>,
Expect
<
Equal
<
Replace
<'foobarbar', 'bar', ''>, 'foobar'>>,
Expect
<
Equal
<
Replace
<'foobarbar', 'bra', 'foo'>, 'foobarbar'>>,
Expect
<
Equal
<
Replace
<'', '', ''>, ''>>,
]

参考