kakasoo

KebabCase type 본문

프로그래밍/TypeScript

KebabCase type

카카수(kakasoo) 2023. 4. 2. 23:02
반응형
type KebabCase<S extends string, IsFirstLetter extends boolean = true> = S extends '' ?
  '' :                                                  // S가 빈문자일 경우에는 빈문자를 리턴한다.
  S extends `${infer F}${infer S}` ?
    F extends Uppercase<F> ?                            // 타입 F의 대문자 형태가 이미 F와 동일하다면, 알파벳이 아니거나 대문자 알파벳이다.
    Uppercase<F> extends Lowercase<F> ?                 // 만약 타입 F의 소문자와 대문자가 일치한다면 알파벳이 아니기에
      `${F}${KebabCase<S,false>}`:                      // F는 그대로, 뒷부분은 다시 케밥케이스를 재귀적으로 호출한다.
      IsFirstLetter extends true ?                      // 만약 기호가 아닐 경우에는, 문자열의 첫번째 글자인지 아닌지에 따라
      `${Lowercase<F>}${KebabCase<S, false>}` :         // 대문자를 소문자로 변경하고 재귀적 호출 혹은
      `-${Lowercase<F>}${KebabCase<S, false>}` :        // 대문자를 소문자로 변경 후 앞에 마이너스 기호를 추가, 그리고 재귀적 호출을 하고,
      `${F}${KebabCase<S, false>}` :                    // 원래부터 소문자일 경우에는 재귀적 호출만을 한다.
    never;                                              // 그 외 경우에는 never

케밥 케이스를 너무 오랜만에 봐서 이러한 컨벤션이 있다는 걸 잊고 살았다.
코드 박스 우측에 주석을 달았으니 모바일인 사람은 좌우 스크롤을 하자

반응형