Skip to content

字符串长度

约 370 字大约 1 分钟

2022-12-01

题目

Github

计算字符串的长度,类似于 String#length

type length = LengthOfString<'Hello World'> // 11

解题思路

Typescript 类型系统不支持 String['length'] 获取字符串的长度,同时,类型系统也没有提供可供累加计算的支持。

但幸运的是,我们可以很容易想到元组类型支持 Tuple['length'] 获取元组的长度,因此我们可以把字符串转换为元组, 每个字符对应元组中的每个成员,通过元组的长度间接获取字符串的长度。

通过模板字面量类型,以及条件类型来实现字符串转换为元组。

答案

type LengthOfString<S extends string, U extends string[] = []> =
  S extends `${infer F}${infer T}`
    ? LengthOfString<T, [F, ...U]>
    : U['length']

验证

import type { Expect, Equal } from '~/tc-utils'
type LengthOfString<S extends string, U extends string[] = []> =
  S extends `${infer F}${infer T}`
    ? LengthOfString<T, [F, ...U]>
    : U['length']

// ---cut---
type cases = [
  Expect<Equal<LengthOfString<''>, 0>>,
  Expect<Equal<LengthOfString<'kumiko'>, 6>>,
  Expect<Equal<LengthOfString<'reina'>, 5>>,
  Expect<Equal<LengthOfString<'Sound! Euphonium'>, 16>>,
]

参考