FE/type-challenge

9142. CheckRepeatedChars

최토피 2023. 9. 6. 12:11
728x90

문제

Implement type CheckRepeatedChars<S> which will return whether type S contains duplicated chars?

type CheckRepeatedChars<'abc'>   // false
type CheckRepeatedChars<'aba'>   // true

cases

type cases = [
  Expect<Equal<CheckRepeatedChars<'abc'>, false>>,
  Expect<Equal<CheckRepeatedChars<'abb'>, true>>,
  Expect<Equal<CheckRepeatedChars<'cbc'>, true>>,
  Expect<Equal<CheckRepeatedChars<''>, false>>,
]

문제 링크

정답

type CheckRepeatedChars<T extends string> = T extends `${infer T1}${infer Rest}`
  ? Rest extends `${string}${T1}${string}`
    ? true
    : CheckRepeatedChars<Rest>
  : false

풀이

조건

  1. 입력 T 중 하나라도 중복되는 character가 있으면 true를 출력한다.
  1. 빈 값이면 false를 출력한다.

해설

중복되는 character를 찾기 위해 앞에서부터 모든 값을 검사해야한다.

이를 위해서 앞에서부터 접근하는 로직을 구현한다.

type CheckRepeatedChars<T extends string> = T extends `${infer T1}${infer Rest}`
  ? true
  : false

T1Rest를 비교해서 중복되는 값을 가지는지 체크하는 타입 HasChar을 구현한다.

type HasChar<T extends string, C extends string> =
    T extends `${infer T1}${infer Rest}`
      ? T1 extends C ? true : HasChar<Rest, C>
      : false

HasChar를 이용해서 재귀로 검사하는 로직을 구현한다.

type CheckRepeatedChars<T extends string> = T extends `${infer T1}${infer Rest}`
  ? HasChar<Rest, T1> extends true
    ? true
    : CheckRepeatedChars<Rest>
  : false

type HasChar<T extends string, C extends string> =
    T extends `${infer T1}${infer Rest}`
      ? T1 extends C ? true : HasChar<Rest, C>
      : false

리팩토링

HasChar 역할을 하는 로직을 다음과 같이 구현할 수 있다.

type CheckRepeatedChars<T extends string> = T extends `${infer T1}${infer Rest}`
  ? Rest extends `${string}${T1}${string}`
    ? true
    : CheckRepeatedChars<Rest>
  : false

혹시 개선점이나, 오류가 있다면 댓글 부탁드립니다.

728x90