logoProsperBao

CamelCase

2022-03-31 06

题目来源(type-challenges)

问题

for-bar-baz -> forBarBaz

解答

type CamelCase<S extends string> = 
  S extends `${infer Pre}-${infer Sub}`
    ? Capitalize<Sub> extends Sub
      ? `${Pre}-${CamelCase<Sub>}`
      : CamelCase<`${Pre}${Capitalize<Sub>}`>
    : S

拆分

  1. 利用 infer 获取 - 两端的值
  2. 利用 Capitalize 转换为首字母大写的字符串和 Sub 对比
  3. 如果对比成功则表示字符串不需要去掉 - 所以要补上然后把转换首字母大写的字符串当作 Sub 继续转换
  4. 如果对比失败则表示字符串需要去掉 - 所以把 Sub 转换为首字母大写的字符串和 Pre 一起继续递归转换
  5. 不满足条件则返回原字符

执行过程

type C = Capitalize
type CA = CamelCase
type result = CamelCase<'foo-bar-baz'> //'fooBarBaz'
执行SPreSubC<Sub> extends Sub下一步
1foo-bar-bazfoobar-bazfalseC<'fooBar-baz'>
2fooBar-bazfooBarbazfalseC<'fooBarBaz'>
3fooBarBazneverneverneverfooBarBaz
type result = CamelCase<'foo-Bar-baz'> //'foo-BarBaz'
执行SPreSubC<Sub> extends Sub下一步
1foo-bar-bazfooBar-baztruefoo-${C<'Bar-baz'>}
2.1Bar-bazBarbazfalseC<'BarBaz'>
2.2BarBazneverneverneverBarBaz
1.1foo-bar-bazfooBar-baztruefoo-BarBaz