挑战
计算字符串的长度,类似于 String#length 。
解答
这道题最开始我想着能不能直接通过索引类型度 length 属性,如果 TypeScript 够聪明的话直接得到结果。
type LengthOfString<S extends string> = S['length'];后来发现想多了,推断出来的类型是 number。
那现在我们换种方式,一般要获取长度,在 TypeScript 类型里最常见的就是获取数组的长度,所以我想能不能先把 string 转换成元组,最后读取这个元组的 length。
我们每次从字符串 S 中取出第一个字符,添加到元组,直到 S 为空。
type StringToTuple<S extends string> = S extends `${infer F}${infer R}`
? [F, ...StringToTuple<R>]
: [];然后直接读取这个类型的 length 属性。
type StringToTuple<S extends string> = S extends `${infer F}${infer R}`
? [F, ...StringToTuple<R>]
: [];
type LengthOfString<S extends string> = StringToTuple<S>['length'];其实这样就可以了,不过网上有些答案把两个类型合并成了一个类型,但是需要加一个辅助泛型,用来保存元组。
type LengthOfString<
S extends string,
T extends string[] = []
> = S extends `${infer F}${infer R}`
? LengthOfString<R, [...T, F]>
: T['length'];