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