타입 챌린지 612 - KebabCase

소파의 벨로그·2025년 3월 27일

타입챌린지

목록 보기
36/131

문제 링크

문제

camelCase나 PascalCase를 kebab-case 문자열로 수정하세요.

FooBarBaz -> foo-bar-baz

내 풀이

type SplitByLowerCase<S extends string,Tuple extends string[]=[],NowString extends string=''>=
  S extends `${infer First}${infer Last}`?
    First extends Lowercase<First>?
      SplitByLowerCase<Last,Tuple,`${NowString}${First}`>
      :SplitByLowerCase<Last,[...Tuple,NowString],Lowercase<First>>
    :Tuple extends ['',...infer Left]?
      [...Left,NowString]
      :[...Tuple,NowString]

type Join<Arr extends string[],Joiner extends string = '-'>=
  Arr extends [infer First extends string,...infer Rest extends string[]]?
    `${First}${0 extends Rest['length']?'':Joiner}${Join<Rest,Joiner>}`
    :''

type KebabCase<S extends string> = Join<SplitByLowerCase<S>>

대문자로 시작되는 글자들을 tuple 형태로 분리하고,
'-'로 join하는 타입을 만들어 구현했다
SplitByLowerCase에 첫 글자가 대문자인 경우 맨 앞에 ''가 들어가므로 이에 대한 분기처리를 해주었다.

다른 사람의 풀이

type KebabCase<S extends string> = S extends `${infer S1}${infer S2}`
  ? S2 extends Uncapitalize<S2>
  ? `${Uncapitalize<S1>}${KebabCase<S2>}`
  : `${Uncapitalize<S1>}-${KebabCase<S2>}`
  : S;

첫 글자를 소문자로 만들어주는 instrinct 타입이 있어서 그걸 사용한 풀이가 있었다.

매우 깔끔한 풀이라고 생각이 든다

참고자료

https://github.com/type-challenges/type-challenges/issues/664

0개의 댓글