타입 챌린지 114 - CamelCase

소파의 벨로그·2025년 6월 25일

타입챌린지

목록 보기
123/131

문제 링크

문제

스네이크 케이스를 카멜케이스로 바꾸는 CamelCase<T>를 구현하라

Implement CamelCase<T> which converts snake_case string to camelCase.

내 풀이

type LowerCaseUnion='a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
type Alphabet=LowerCaseUnion|Uppercase<LowerCaseUnion>

type CamelCase<S extends string> =
  S extends `${infer A}_${infer WordFirst extends Alphabet}${infer WordRest}`?
    `${Lowercase<A>}${Uppercase<WordFirst>}${CamelCase<WordRest>}`
  :S extends `${infer A}__${infer WordFirst extends Alphabet}${infer WordRest}`?
    `${Lowercase<A>}_${Uppercase<WordFirst>}${CamelCase<WordRest>}`
  :Lowercase<S>

우선 스네이크 케이스를 정의했다.
스네이크 케이스는 각 word를 _로 이은 표기법이다.
이때 word의 기준은 다음과 같이 정의 내렸다.

  • _${알파벳}앞뒤로 있는 글자
  • 이때 구분자인 _${알파벳}의 경우 _는 word에 해당하지않고 알파벳은 뒷 word의 첫 문자에 해당한다.

이후 카멜 케이스에 대해 정의내렸다.

  • 기본적으로 모든 문자는 소문자이다.
  • 단 다음과 같은 경우에는 별도의 방식을 적용한다.
    - word의 첫 글자는 대문자
    - 단, 첫 word의 첫글자는 소문자

우선 해당 타입을 깔끔하게 구현하기 위해 Alphabet이라는 유니온 타입을 정의했다.
(IsAlphabet을 사용하지 않은 이유는 word의 첫 문자를 확인하기 위해 infer word로 추론하고 다시 추론한 값을 재확인 하지 않기 위해, 즉 구현 상의 코드를 줄이기 위해)

내가 구현한 CamelCase는 다음과 같이 작동한다.

1) _ 앞에 있는 문자는 전부 소문자
2) _ 앞에 있는 문자를 처리하고 남은 _${알파벳}${다른 글자}가 있다면
_뒤에 있는 알파벳은 대문자, 다른 글자는 재귀적으로 CamelCase에 넣음
3) _${알파벳}이 없다면 모두 소문자

구현체에 있는 두 번째 extends 문은 __${알파벳}과 같은 문자를 첫번째 extends 문이 인식하지 못해 작성한 조건문이다.

0개의 댓글