[TypeScript] Type Challenges #298 - Length of String

60 阅读1分钟

题目描述

计算字符串的长度,类似于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 stringT进行约束,确保T是一个字符串

引入泛型

引入泛型AccAcc是一个累积器,用来存储分割的字符串,默认值为[]

条件类型

type LengthOfString<T extends string, Acc extends string[] = []> =
  T extends `${infer Head}${infer Tail}`
      ? LengthOfString<Tail, [Head, ...Acc]>
      : Acc['length'];
  • 如果T不是空字符串

    • infer Head:将T的第一个字符推断为Head
    • infer Tail:将T的剩余字符推断为Tail
    • 递归调用LengthOfString<Tail, [Head, ...Acc]>,将Head添加到Acc开头,继续处理Tail
  • 如果T是空字符串

    • 返回Acc的长度,即Acc['length']