이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
From을 To로 바꾸는 Replace 타입을 만들면 된다.
어... 생각보다 간단했다. 답이 바로 나왔다!
type Replace<S extends string, From extends string, To extends string> =
S extends `${infer F}${From}${infer L}` ?
(From extends '' ?
S : `${F}${To}${L}`) :
S;
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
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<'', '', ''>, ''>>,
]
S extends `${infer F}${From}${infer L}` ? : S에 제네릭 From이 들어가면,
(From extends '' ? S : `${F}${To}${L}`) : S : From이 빈 문자열인지 보고, 빈문자열이면 S를 그대로 리턴하고, 아니면 From을 To로 바꿔서 리턴한다. 그리고 제네릭에 From이 안들어가면 S를 그대로 리턴한다.
여기서 S extends `${infer F}${From}${infer L}` 과 From extends '' 의 순서는 바뀌어도 상관없다.
From extends '' ? S : S extends `${infer F}${From}${infer L}` ? ~ 이런식으로 써도 상관없다! (이게 성능상 더 좋을지도?)
'Language > Typescript' 카테고리의 다른 글
타입챌린지 : 191-Append Argument (medium) (0) | 2023.03.31 |
---|---|
타입챌린지 : 119-ReplaceAll (medium) (0) | 2023.03.31 |
타입챌린지 : 110-Capitalize (medium) (0) | 2023.03.29 |
타입챌린지 : 108-Trim (medium) (0) | 2023.03.28 |
타입챌린지 : 106-Trim Left (medium) (0) | 2023.03.27 |