问题 #
实现 CapitalizeWords<T>
将字符串中 每个单词 的第一个首字母变成大写。
type case1 = CapitalizeWords<'foobar'> // 'Foobar'
type case2 = CapitalizeWords<'FOOBAR'> // 'FOOBAR'
type case3 = CapitalizeWords<'foo bar'> // 'Foo Bar'
type case4 = CapitalizeWords<'foo bar hello world'> // 'Foo Bar Hello World'
type case5 = CapitalizeWords<'foo bar.hello,world'> // 'Foo Bar.Hello,World'
type case6 = CapitalizeWords<''> // ''
解答 #
type CapitalizeWords<S extends string, Flag extends boolean = true> =
S extends `${infer F}${infer R}`
? Lowercase<F> extends Uppercase<F>
? `${F}${CapitalizeWords<Capitalize<R>, false>}`
: `${Flag extends true ? Capitalize<F> : F}${CapitalizeWords<R, false>}`
: S
拆分 #
- 首先拆分字符串分为第一个字符
F
和剩下所有的字符R
- 如果拆分不了则直接返回原字符串,如果可以拆分则判断是否是特殊字符
- 如果是特殊字符
Lowercase<F>
和Uppercase<F>
是返回原字符串的 - 如果是特殊字符则需要跳过当前字符,然后把后续的字符串的第一个字符变成大写
- 如果不是特殊字符则判断
FLAG
是否为true
,如果是则将第一个字符变成大写,如果不是则不变 - 将剩下的字符串再次拆分,然后将结果连接起来