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
풀이
조건
- 입력
T
중 하나라도 중복되는character
가 있으면true
를 출력한다.
- 빈 값이면
false
를 출력한다.
해설
중복되는 character
를 찾기 위해 앞에서부터 모든 값을 검사해야한다.
이를 위해서 앞에서부터 접근하는 로직을 구현한다.
type CheckRepeatedChars<T extends string> = T extends `${infer T1}${infer Rest}`
? true
: false
T1
과 Rest
를 비교해서 중복되는 값을 가지는지 체크하는 타입 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