新闻详情

新闻详情

首页 / 资讯中心 / 详情

type-challenges 题解:298 Length of String——用模板字面量类型在类型层计算字符串长度

发布时间:2026/10/1 2:11:55来源:尧图网络
type-challenges 题解:298 Length of String——用模板字面量类型在类型层计算字符串长度
示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载Length of String是 type-challenges 仓库中的一道中等medium难度挑战题要求实现一个与String#length行为一致的LengthOfStringS类型给定一个字符串字面量类型在类型层面返回其字符个数。本文围绕这道题的题目描述、测试用例与源码展开先分析为什么「直接取length」行不通再给出基于模板字面量类型与递归累积元组的完整解法并逐一验证测试用例帮助读者掌握字符串类型运算的核心套路。挑战概览题目要求与基本信息题目位于 questions/00298-medium-length-of-string/其日文版描述README.ja.md即本文的关联文档String#lengthと同じように、文字列リテラルの長さを計算します。 与String#length相同计算字符串字面量的长度。由 info.yml 可以确认题目的元信息字段值difficultymedium中等titleLength of Stringtagstemplate-literal模板字面量authorPig FangGitHub: g-plane仓库为这道题提供了两个关键文件起点模板 template.ts第 1 行type LengthOfStringS extends string any我们的任务就是把any替换为能正确返回字符串长度的类型实现。测试用例 test-cases.ts第 1–8 行import type { Equal, Expect } from type-challenges/utils type cases [ ExpectEqualLengthOfString, 0, ExpectEqualLengthOfStringkumiko, 6, ExpectEqualLengthOfStringreina, 5, ExpectEqualLengthOfStringSound! Euphonium, 16, ]可以看到要求覆盖四种情况空字符串、普通单词、含空格与标点的字符串。测试使用了仓库 utils/index.d.ts 中定义的Equal与Expect工具类型Equal基于函数参数逆变比较实现严格类型相等判定见 utils/index.d.ts只有当LengthOfStringS与期望的字面量数字类型完全一致时编译才会通过。为什么S[length]行不通一个最直觉的尝试是模仿 JavaScript 直接读取 length 属性type LengthOfStringS extends string S[length]但这样得到的结果并不是字面量数字。在 TypeScript 的类型系统里kumiko[length]的类型是number而不是6。这是因为字符串字面量类型本身不携带「长度」这一精确信息——length是运行时属性其类型层面只能给出宽泛的number。这与元组tuple形成鲜明对比[k,u,m]这样的元组类型可以直接通过T[length]得到精确的字面量3因为元组的长度信息编码在类型结构本身。因此一个常见思路是先把字符串类型转换累积成一个元组类型再读取该元组的length。字符串无法直接转元组但可以通过递归拆分字符逐位累积这正是本题的核心解法。核心思路模板字面量拆分 元组累积 读取 length解法可以拆解为三步按字符拆分利用模板字面量类型的模式匹配S extends \${infer F}${infer R}将字符串拆成「第一个字符F」和「剩余部分R」递归累积成元组每拆出一个字符就把它追加进一个累积元组T同时用R继续递归递归出口返回长度当S拆空即空字符串时条件分支失败直接返回累积元组的T[length]。模板字面量类型template literal types允许在${infer F}${infer R}这样的模式中对字符串内容做推断当字符串至少有一个字符时F被推断为首字符的字面量类型R被推断为剩余部分。若S为空字符串则该模式无法匹配条件结果为false从而自然落入出口分支——空串长度即0与第一个测试用例吻合。参考实现基于上述思路一个简洁可运行的实现如下type LengthOfStringS extends string, T extends string[] [] S extends ${infer F}${infer R} ? LengthOfStringR, [...T, F] : T[length]逐行解读泛型参数T extends string[] []是内部累积元组默认从空数组开始对外调用者无需感知S extends \${infer F}${infer R}若S非空推断首字符F与剩余串R真分支LengthOfStringR, [...T, F]将F追加进元组T[...T, F]生成新元组并针对剩余部分继续递归假分支T[length]当S为空字符串时返回累积元组的长度即字符串的字符数。也可以不保存字符本身、只做计数用unknown占位累积元组type LengthOfStringS extends string, T extends readonly unknown[] [] S extends ${string}${infer R} ? LengthOfStringR, [...T, unknown] : T[length]两种写法在语义上等价区别仅在于累积元组里存的是真实字符还是占位符对本题的输出长度没有影响。这里使用readonly unknown[]是为了让累积元组更「通用」避免字符串字面量带来的不必要约束。测试用例逐一验证结合 test-cases.ts 中的四个用例手动推导一遍参考实现的求值过程LengthOfStringS为空字符串 extends \${infer F}${infer R}不成立直接返回[]的length即0✅ 与ExpectEqualLengthOfString, 0 匹配LengthOfStringkumiko依次拆出k、u、m、i、k、o共 6 个字符递归 6 层后S为空累积元组为 6 元组返回6✅ 与第二个用例匹配LengthOfStringreina同理拆出r、e、i、n、a共 5 个字符返回5✅ 与第三个用例匹配LengthOfStringSound! Euphonium注意这里的空格字符也会被正常拆分并计入长度。逐字符计数为S(1)o(2)u(3)n(4)d(5)!(6) (7)E(8)u(9)p(10)h(11)o(12)n(13)i(14)u(15)m(16)共 16 个字符返回16✅ 与第四个用例匹配。四个用例全部通过时type cases数组中的Expect类型才能满足true约束ExpectT extends true定义见 utils/index.d.ts从而通过类型检查。边界情况与注意事项空字符串上面两种实现都天然处理了空串返回0的情况无需额外判断递归深度限制该解法对每个字符递归一次TypeScript 类型实例化存在深度限制因此超长字符串例如数百字符以上可能触发「Type instantiation is excessively deep」之类的编译错误。从实现原理看这是模板字面量递归解法的固有约束也是仓库后续推出 hard 难度同类题如 00651-hard-length-of-string-2 与 31824-hard-length-of-string-3进一步优化的动机之一字符切分粒度模板字面量类型的${infer F}${infer R}按字符code unit粒度切分对于含 emoji 等代理对surrogate pair的字符串一个「视觉字符」可能被拆成多个单元计数结果可能与String#length的运行时行为一致后者同样按 code unit 计数本题测试用例均为 ASCII 字符不受影响泛型约束S extends string保证入参一定是字符串字面量类型非字符串传入会在编译期被拒绝。延伸递归与同类挑战本题属于模板字面量类型template-literal标签下的中等题其解法是后续一系列 hard 字符串题的基石递归拆分字符串再重组的技术可迁移到 00114-hard-camelcase、00612-medium-kebabcase 等字符串改写类题目「用元组累积代替计数」的思路广泛用于 07544-medium-construct-tuple、02257-medium-minusone 等构造元组/数字运算题目仓库 guides/ 目录下还规划了recursive.md、infer.md等学习指南目前为 TODO 待补充状态可见递归与推断正是这类挑战的两个核心主题。如何在本仓库本地验证仓库采用 pnpm 管理依赖见根目录 package.jsonpackageManager: pnpm8.12.1并提供了type-challenges/utils工作区包utils/目录。若要本地验证本题解法在仓库根目录执行pnpm install安装依赖在 questions/00298-medium-length-of-string/template.ts 中写入上文实现运行类型检查例如pnpm exec tsc --noEmit类型检查配置见根目录 tsconfig.json当 test-cases.ts 中的四个ExpectEqual...全部通过时即表示解答正确。通过本题读者可以完整掌握「模板字面量类型模式匹配 递归 元组长度」这一类型体操高频组合拳为后续攻克更复杂的字符串类型挑战打下坚实基础。赞分享示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载相关推荐在类型系统中计算字符串长度深入解析 type-challenges 第 298 题 Length of String在类型系统中计算字符串长度深入解析 type challenges 第 298 题 Length of String 本篇文章围绕 type challeng示例工程type-challenges 中等题 298用模板字面量类型与递归实现 Length of Stringtype challenges 中等题 298用模板字面量类型与递归实现 Length of String 本文围绕 type challenges 题库中编示例工程PixiJS 过滤器Filters完全指南内置滤镜、高级混合模式与自定义着色器PixiJS 过滤器Filters完全指南内置滤镜、高级混合模式与自定义着色器 过滤器Filters是 PixiJS 后处理体系的核心它们能对任意显示例工程上一篇RIFE-NCNN-Vulkan实时视频帧插值的终极解决方案下一篇Sandcastle 内置 Agent Provider 的边界精选列表、能力门槛与公共扩展接缝创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

南康售后完善的GEO服务商综合实力推荐:口碑不错的正规服务商合作实力参考 2026/10/1 3:02:23

南康售后完善的GEO服务商综合实力推荐:口碑不错的正规服务商合作实力参考

赣州硕为科技有限公司是国内专注AI GEO优化服务的企业级营销服务商,依托生成式AI算法底层研究成果,为医疗健康、K12教育、先进制造、家居建材、跨境出海等行业的中大型企业及成长型企业提供AI搜索优化、海外AIGEO优化、ChatGPT搜索优化等定制化服务&…

阅读更多 →
多模型股价预测实战:数据管道、验证与LSTM调参 2026/10/1 3:02:23

多模型股价预测实战:数据管道、验证与LSTM调参

简介:使用Python实现机器学习股价预测源码,面向毕业设计、期末大作业或课程设计场景,帮助计算机相关专业学生快速完成股票价格预测系统。资源融合线性回归、LSTM、ARIMA、KNN等多种主流模型,完整覆盖数据预处理、模型训练、回测和…

阅读更多 →
ARIMAX多变量时序预测实战:从数据对齐到业务归因 2026/10/1 3:02:23

ARIMAX多变量时序预测实战:从数据对齐到业务归因

简介:本资源是一套基于ARIMAX的多变量时间序列预测模型完整实现,专为计算机、统计学及数据科学相关专业学生设计,适用于毕业设计、课程设计与期末大作业等实践场景,尤其适合缺乏项目经验但需快速上手建模任务的学习者。压缩包共8个…

阅读更多 →
YOLO垃圾分类数据集:支持VOC/COCO/YOLO三格式的工业级训练部署包 2026/10/1 3:02:23

YOLO垃圾分类数据集:支持VOC/COCO/YOLO三格式的工业级训练部署包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的垃圾分类检测数据集及配套开发套件,解决真实场景下模型训练缺乏高质量标注数据与完整工程支持的痛点。资源包含10000张真实场景高清图片,提供VOC(XML)、C…

阅读更多 →
Fabric企业级区块链可信账本落地实践 2026/10/1 3:02:23

Fabric企业级区块链可信账本落地实践

简介:这是一套基于Hyperledger Fabric构建的企业级区块链解决方案,聚焦资产全生命周期管理、可信交易、防伪验证与全程溯源四大核心场景,面向计算机类专业学生、高校教师及企业开发人员,尤其适合作为毕业设计、课程设计或区块链工…

阅读更多 →
基于Transformer的遥感影像变化检测全流程解析 2026/10/1 3:02:17

基于Transformer的遥感影像变化检测全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉