Length of String
问题描述
计算字符串的长度,类似于 String#length 。
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<LengthOfString<''>, 0>>,
Expect<Equal<LengthOfString<'kumiko'>, 6>>,
Expect<Equal<LengthOfString<'reina'>, 5>>,
Expect<Equal<LengthOfString<'Sound! Euphonium'>, 16>>
]
// ============= Your Code Here =============
// 答案1
type LengthOfString<S extends string, T extends string[] = []> = S extends `${infer F}${infer R}`
? LengthOfString<R, [...T, F]>
: T['length']
// 答案2
type LengthOfString<S extends string, T extends string[] = []> = S extends `${string}${infer R}`
? LengthOfString<R, [...T, string]>
: T['length']
这道题的思路,首先,我们应该想到 T['length'] ,但是 length 只能对元组类型才会返回长度,对于数组类型只会返回 number 类型,所以我们需要将字符串转为元组类型,做过很多道字符串的题,应该可以想到一个一个取字符串出来,所以首先构建条件类型 " S extends ${infer F}${infer R}" ,这里的泛型 F 应该存起来,但是存在哪里呢,所以需要第二个泛型参数 T,将第一个字符的类型存在泛型 T 中,将去除第一个字符的剩余字符,也就是泛型 R 继续递归得到类型,最后的泛型 T 就是取到所有字符串类型的元组,也就是在最后一次判断时,条件不成立,返回了 T['length'],可以将答案1优化,因为传入的肯定是字符串,所以可以去除一个 infer 推断。