logoProsperBao

KebabCase

2022-03-31 08

题目来源(type-challenges)

问题

FooBarBaz -> foo-bar-baz

解答

type KebabCase<S, T extends string = ""> = 
S extends `${infer First}${infer Rest}` 
  ? First extends Uncapitalize<First>
    ? KebabCase<Rest, `${T}${First}`>
    : T extends ""
      ? KebabCase<Rest, `${Uncapitalize<First>}`>
      : KebabCase<Rest, `${T}-${Uncapitalize<First>}`>
  : T;

拆分

  1. 利用大写转换之后变成小写和原来的对比
  2. 如果和原来一样就直接拼接
  3. 如果和原来不一样就判断是否是首字
  4. 根据判断结果添加 -

执行步骤

foo-bar

STFirstRestFirst=U<First>T=""result
foo-barfoo-bartrueneverKebabCase<oo-bar, f>
oo-barfoo-bartrueneverKebabCase<o-bar, fo>
o-barfoo-bartrueneverKebabCase<-bar, foo>
-barfoo-bartrueneverKebabCase<bar, foo->
barfoo-bartrueneverKebabCase<ar, foo-b>
arfoo-bartrueneverKebabCase<r, foo-ba>
rfoo-baneverneverneverneverr

FooBarBaz

STFirstRestFirst=U<First>T=""result
FooBarFooBarfalsetrueKebabCase<ooBar, f>
ooBarfooBartrueneverKebabCase<oBar, fo>
oBarfooBartrueneverKebabCase<Bar, foo>
BarfooBarfalseneverKebabCase<ar, foo-b>
arfoo-bartrueneverKebabCase<r, foo-ba>
rfoo-bartrueneverKebabCase<never, foo-bar>
neverfoo-barneverneverneverneverfoo-bar