🫧 문제
문자열 S에서 From를 찾아 한 번만 To로 교체하는 Replace<S, From, To>를 구현하세요.
type replaced = Replace<'types are fun!', 'fun', 'awesome'> // expected to be 'types are awesome!'
🛠️ 테스트 케이스
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<'', '', ''>, ''>>,
]
🎱 정답
type Replace<S extends string, From extends string, To extends string> =
From extends '' ? S : S extends `${infer A}${From}${infer B}` ? `${A}${To}${B}` : S;
💭 해설
1. 테스트 케이스에 From 이 ' '인 경우가 있어 먼저 From 이 ' '인지 확인을 하고 맞다면 S를 반환합니다.
2. 아닌 경우에는 S가 ${infer A}${From}${infer B} (From을 기준으로 앞뒤로 문자열이 있다면 infer를 통해서 구분을 해준다) 형태가 맞다면 ${A}${To}${B}(From만 To로 바꿔주고 나머지는 추론한 문자열 그대로 반환한다)형태로 아니라면 S를 그대로 반환한다.
'TypeScript' 카테고리의 다른 글
[Type-Challenges] 296. Permutation (0) | 2023.06.20 |
---|---|
[Type-Challenges] 119. ReplaceAll (0) | 2023.06.13 |
[Type-Challenges] 110.Capitalize (0) | 2023.06.13 |
[Type-Challenges] 18. Trim (0) | 2023.06.13 |
[TypeScript] Error(feat. catch) 타입 설정하기 (0) | 2023.05.01 |