Skip to content

Latest commit

 

History

History
39 lines (30 loc) · 1.74 KB

CapitalizeWords.md

File metadata and controls

39 lines (30 loc) · 1.74 KB
标题 标签
CapitalizeWords(单词首字母大写) extends,infer(继承,推断)

单词首字母大写。

  • 构建第二个参数作为占位符,如空白/符号等则作为第二个参数,使用 infer 推断字符串每一个字符,使用 Uppercase 类型用于避免递归嵌套过深的错误,判断字符是否是小写 Lowercase 类型,如果是,则使用 Capitalize 类型转成大写,并且前面跟随占位符,递归剩余字符,否则递归剩余字符,返回占位符和大写后的字符组成的模板字符串,否则递归占位字符。

代码如下:

type CapitalizeWords<
  S extends string,
  W extends string = ''
> = S extends `${infer A}${infer B}`
  ? Uppercase<A> extends Lowercase<A>
    ? `${Capitalize<`${W}${A}`>}${CapitalizeWords<B>}`
    : CapitalizeWords<B, `${W}${A}`>
  : Capitalize<W>;

使用方式:

type CapitalizeWords1 = CapitalizeWords<'foobar'>; // 'Foobar'
type CapitalizeWords2 = CapitalizeWords<'FOOBAR'>; // 'FOOBAR'
type CapitalizeWords3 = CapitalizeWords<'foo bar'>; // 'Foo Bar'
type CapitalizeWords4 = CapitalizeWords<'foo bar hello world'>; // 'Foo Bar Hello World'
type CapitalizeWords5 = CapitalizeWords<'foo bar.hello,world'>; // 'Foo Bar.Hello,World'
type CapitalizeWords6 =
  CapitalizeWords<'aa!bb@cc#dd$ee%ff^gg&hh*ii(jj)kk_ll+mm{nn}oo|pp🤣qq'>; // 'Aa!Bb@Cc#Dd$Ee%Ff^Gg&Hh*Ii(Jj)Kk_Ll+Mm{Nn}Oo|Pp🤣Qq'
type CapitalizeWords7 = CapitalizeWords<''>; // ''

应用场景

如下所示,鼠标悬浮到对应的类型变量可以查看类型。