🫧 문제
주어진 문자열 S에서 부분 문자열 From을 찾아 모두 To로 교체하는 제네릭 ReplaceAll<S, From, To>을 구현하세요.
type replaced = ReplaceAll<'t y p e s', ' ', ''> // expected to be 'types'
🛠️ 테스트 케이스
type cases = [
Expect<Equal<ReplaceAll<'foobar', 'bar', 'foo'>, 'foofoo'>>,
Expect<Equal<ReplaceAll<'foobar', 'bag', 'foo'>, 'foobar'>>,
Expect<Equal<ReplaceAll<'foobarbar', 'bar', 'foo'>, 'foofoofoo'>>,
Expect<Equal<ReplaceAll<'t y p e s', ' ', ''>, 'types'>>,
Expect<Equal<ReplaceAll<'foobarbar', '', 'foo'>, 'foobarbar'>>,
Expect<Equal<ReplaceAll<'barfoo', 'bar', 'foo'>, 'foofoo'>>,
Expect<Equal<ReplaceAll<'foobarfoobar', 'ob', 'b'>, 'fobarfobar'>>,
Expect<Equal<ReplaceAll<'foboorfoboar', 'bo', 'b'>, 'foborfobar'>>,
Expect<Equal<ReplaceAll<'', '', ''>, ''>>,
]
🎱 정답
type ReplaceAll<S extends string, From extends string, To extends string> =
From extends '' ? S : S extends `${infer A}${From}${infer B}`
? `${A}${To}${ReplaceAll<B, From, To>}`
: S
💭 해설
1. 마지막 테스트 케이스로 인해 From이 ' ' 형태인지 확인 한다. 맞다면 S를 그대로 반환한다.
2. 아니라면 From을 기준으로 앞을 infer A로 추론하고 뒤를 infer B로 추론한다. -> ${infer A}${From}${infer B}
3. ${infer A}${From}${infer B}의 형태가 맞다면 From 앞부분은 ${A}${To}으로 바꿔주고 뒷부분 중 다음 From을 To로 바꾸기 위해서 ReplaceAll<B, From, To>로 재귀를 돌려준다 -> ${A}${To}${ReplaceAll<B, From, To>}
4. 아니라면 S를 반환한다.
'TypeScript' 카테고리의 다른 글
[Type-Challenges] 1367 - Remove Index Signature (0) | 2023.07.11 |
---|---|
[Type-Challenges] 296. Permutation (0) | 2023.06.20 |
[Type-Challenges] 116. Replace (0) | 2023.06.13 |
[Type-Challenges] 110.Capitalize (0) | 2023.06.13 |
[Type-Challenges] 18. Trim (0) | 2023.06.13 |