본문 바로가기
Language/Typescript

타입챌린지 : 2070-Drop Char (medium)

by hsloth 2023. 5. 1.

 

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

 

https://github.com/type-challenges/type-challenges/blob/main/questions/02070-medium-drop-char/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

 

문자열에서 지정한 문자를 제거하는 타입이다.

생각보다 쉬웠다.

type DropChar<S, C, T extends string = ''> = S extends `${infer F}${infer O}` ?
  F extends C ? DropChar<O, C, T> : DropChar<O, C, `${T}${F}`> : T

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  // @ts-expect-error
  Expect<Equal<DropChar<'butter fly!', ''>, 'butterfly!'>>,
  Expect<Equal<DropChar<'butter fly!', ' '>, 'butterfly!'>>,
  Expect<Equal<DropChar<'butter fly!', '!'>, 'butter fly'>>,
  Expect<Equal<DropChar<'    butter fly!        ', ' '>, 'butterfly!'>>,
  Expect<Equal<DropChar<' b u t t e r f l y ! ', ' '>, 'butterfly!'>>,
  Expect<Equal<DropChar<' b u t t e r f l y ! ', 'b'>, '  u t t e r f l y ! '>>,
  Expect<Equal<DropChar<' b u t t e r f l y ! ', 't'>, ' b u   e r f l y ! '>>,
]

type DropChar<S, C, T extends string = ''> : 문자열을 저장할 수 있도록 제네릭 T를 설정해준다.

S extends `${infer F}${infer O}` ? : S를 첫 번째 문자와 나머지 문자열로 나누고,

F extends C ? DropChar<O, C, T> : DropChar<O, C, `${T}${F}`> : F가 C와 같다면, DropChar를 재귀하는데, 이때, T를 그대로 넘긴다. 만약 F가 C와 다르다면, DropChar를 하는데, T와F를 문자열로 하여 동시에 넘긴다.

T : 만약 재귀에 끝에 도달했다면, T를 리턴한다.

 

이제 다른 분들의 답을 봐보자.

type DropChar<S, C extends string> = S extends `${infer L}${C}${infer R}` ?
	DropChar<`${L}${R}`, C> : S;

와... 이렇게도 풀 수 있구나... 전에도 이런 식의 문제를 봤었던 것 같은데.. 타입챌린지를 하면서 타입스크립트 문법에 익숙해질 필요가 있다고 느낀다... 열심히하자!!