题目描述
计算字符串的长度,类似于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 =============
type LengthOfString<T extends string, Acc extends string[] = []> =
T extends `${infer Head}${infer Tail}`
? LengthOfString<Tail, [Head, ...Acc]>
: Acc['length'];
类型约束
使用T extends string对T进行约束,确保T是一个字符串
引入泛型
引入泛型Acc,Acc是一个累积器,用来存储分割的字符串,默认值为[]
条件类型
type LengthOfString<T extends string, Acc extends string[] = []> =
T extends `${infer Head}${infer Tail}`
? LengthOfString<Tail, [Head, ...Acc]>
: Acc['length'];
-
如果
T不是空字符串infer Head:将T的第一个字符推断为Headinfer Tail:将T的剩余字符推断为Tail- 递归调用
LengthOfString<Tail, [Head, ...Acc]>,将Head添加到Acc开头,继续处理Tail
-
如果
T是空字符串- 返回
Acc的长度,即Acc['length']
- 返回