본문 바로가기
Language/Typescript

타입챌린지 : 116-Replace (medium)

by hsloth 2023. 3. 30.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/00116-medium-replace/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

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}` ? ~ 이런식으로 써도 상관없다! (이게 성능상 더 좋을지도?)