type-challenges 第 15 题「最后一个元素 Last of Array」:用类型体操实现数组尾元素提取
示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载type-challenges 是一个带在线判题功能的 TypeScript 类型挑战集合第 15 题「最后一个元素Last of Array」要求实现一个名为LastT的类型泛型它接收一个数组类型T并返回该数组最后一个元素的类型。本文将以 第 15 题中文 README 为骨架结合仓库中的 模板文件、测试用例 与相关挑战讲解从题目理解、边界情况分析到多种解法原理的完整链路读完你将掌握infer 可变元组类型variadic tuple types提取数组尾部元素的方法并能在本地跑通测试验证。题目速览从数组类型中推导最后一个元素原题描述非常简洁实现一个LastT泛型它接受一个数组T并返回其最后一个元素的类型题目难度为medium标签为array由 Anthony Fu 出题并建议在 TypeScript 4.0 下完成info.yml 中记录了difficulty: medium、tags: array、related: 14, 16。题目给出的示例type arr1 [a, b, c] type arr2 [3, 2, 1] type tail1 Lastarr1 // 应推导出 c type tail2 Lastarr2 // 应推导出 1你需要填补 template.ts 中唯一的占位type LastT extends any[] any把any换成你的实现使其通过全部测试用例。测试用例答案的唯一裁判在 test-cases.ts 中可以看到本题的四个验收标准import type { Equal, Expect } from type-challenges/utils type cases [ ExpectEqualLast[], never, ExpectEqualLast[2], 2, ExpectEqualLast[3, 2, 1], 1, ExpectEqualLast[() 123, { a: string }], { a: string }, ]这些用例透露了三个关键信息空数组返回neverLast[]必须是never。这要求你的实现必须处理空元组的分支不能抛错也不能返回any。单元素元组返回自身Last[2]推导为2说明推导结果必须是字面量类型而不是number之类的宽化类型——这正是元组tuple与普通数组类型的关键区别。元素类型可以是任意复杂类型最后一个用例中的元素是() 123函数类型和{ a: string }对象类型Last必须原样返回{ a: string }证明它不关心元素是什么只关心位置。其中Equal与Expect来自仓库的 utils/index.d.tsexport type ExpectT extends true T export type EqualX, Y (T() T extends X ? 1 : 2) extends (T() T extends Y ? 1 : 2) ? true : falseEqual是严格相等检查基于函数类型参数逆变性的判断比简单的extends互推更严格因此你的实现必须精确匹配目标类型而不是“近似成立”。标准解法条件类型 infer 可变元组最经典、也是 TypeScript 官方文档推荐思路的解法如下type LastT extends any[] T extends [...infer _, infer L] ? L : never逐段拆解T extends any[]约束Last的入参必须是数组或元组类型保证T[length]等数组内建能力可用[...infer _, infer L]这是可变元组类型variadic tuple typeTypeScript 4.0 引入与infer的配合。模式[...前缀, 尾元素]表示“把元组分成前 N-1 项和最后一项两部分”infer _捕获前面所有元素用_命名表示我们并不关心infer L捕获最后一个元素的类型? L : never如果T能匹配上述模式即至少有一个元素返回最后一项类型空元组[]无法拆出“最后一项”走never分支正好满足Last[]的验收要求。以Last[a, b, c]为例类型系统把[a, b, c]与[...infer _, infer L]对齐_被推导为[a, b]L被推导为c最终返回c。为什么题目建议使用 TypeScript 4.0[...infer _, infer L]这种在元组尾部进行“变长前缀 单元素”的模式匹配依赖可变元组类型variadic tuple types这是 TypeScript 4.02020 年 8 月发布的核心新特性。在 4.0 之前infer只能捕获固定长度的元组片段无法表达“任意长度的前缀”因此这道题才会在描述中给出“在此挑战中建议使用 TypeScript 4.0”的提示。仓库根目录 package.json 的 devDependencies 使用typescript: ^5.3.3在本地用现代版本验证本题没有任何兼容问题。另一种思路借助索引访问与T[length]有经验的读者可能还会想到用元组索引来取尾元素。由于元组类型保留了精确的长度信息[3, 2, 1]的T[length]就是字面量3于是可以构造type LastT extends any[] [any, ...T][T[length]]思路是在T前面“垫”一个any使新元组的长度比T大 1那么下标T[length]恰好指向原元组最后一个位置。例如[3, 2, 1]变成长度为 4 的[any, 3, 2, 1]取下标 3 得到1。但要注意它的边界缺陷当T是[]时T[length]为 0[any][0]推导为any无法满足测试用例要求的never除非额外叠加T extends [] ? never这样的分支。相比之下[...infer _, infer L] ? L : never天然覆盖空数组分支更加干净、推荐优先掌握。本地验证如何跑通测试这是一个 pnpm workspace 项目type-challenges/utils通过workspace:*协议链接见根目录 package.json。你可以在项目根目录执行pnpm install安装完成后把 template.ts 中any替换为你的实现然后让 TypeScript 编译器按 tsconfig.json 检查 test-cases.tspnpm exec tsc --noEmit questions/00015-medium-last/test-cases.ts或者直接让 IDE 的 TS Server 对测试文件做类型检查。如果实现正确ExpectEqual...全部通过如果实现有误例如返回了unknown或没有处理空数组Equal会得到falseExpectT extends true立即报类型错误这正是本项目“用类型系统当裁判”的判题方式。在挑战序列中的定位与 First、Pop 串联学习题目是数组系列挑战链上的一环info.yml 明确标注related: 14, 16第 14 题「第一个元素」easyREADME.zh-CN.md实现FirstT返回数组首元素标准写法是T extends [infer F, ...any[]] ? F : never。它与本题互为镜像——一个拆头部、一个拆尾部第 16 题「排除最后一项」mediumREADME.zh-CN.md实现PopT返回去掉最后一项后的数组标准写法T extends [...infer R, any] ? R : never其 test-cases.ts 还要求Pop[]得到[]。把三道题放一起对比非常直观First用[infer F, ...]从头部切Last用[...infer _, infer L]从尾部切Pop用[...infer R, any]把尾部“吞掉再吐前缀”。三者共享同一套可变元组匹配语法只要吃透其中一道另外两道都能顺手解决——这也是 type-challenges 设计挑战序列的用意所在。小结LastT这道 medium 题的核心价值在于让你熟练掌握两个 TypeScript 高级类型能力条件类型 infer的元组模式匹配[...infer _, infer L]是“切分元组”的通用范式后续的Pop、Shift、Slice等大量数组类挑战都建立在这一范式之上边界意识空数组要返回never这是测试用例强制的行为也提醒我们在类型设计中永远要考虑空输入。动手实践建议先自己写一版提交到 在线判题题目 README 中的接受挑战入口再对照本文标准解法检查边界最后顺手把第 14、16 题一起刷掉形成“首元素 / 尾元素 / 去掉尾元素”的完整知识闭环。赞分享示例工程【免费下载链接】type-challengesCollection of TypeScript type challenges with online judge项目地址https://gitcode.com/GitHub_Trending/ty/type-challenges点击查看免费下载相关推荐CUDA 加速 Black-Scholes 期权定价cuda-samples BlackScholes 示例源码级解析CUDA 加速 Black Scholes 期权定价cuda samples BlackScholes 示例源码级解析 导读 本文基于 NVIDIA CUDA示例工程TypeScript 类型挑战 15实现 LastT 泛型提取数组最后一个元素类型TypeScript 类型挑战 15实现 LastT 泛型提取数组最后一个元素类型 导读 LastT 是 type challenges 题库中的第 1示例工程Boss Show Time招聘时间可视化终极指南让你的求职更高效Boss Show Time招聘时间可视化终极指南让你的求职更高效 还在为招聘平台上的模糊时间信息而烦恼吗Boss Show Time是一款专为求职者设计前端上一篇从零到一APK Installer在 Windows 上安装安卓应用的终极保姆级指南下一篇TrafficMonitorPlugins插件合集让任务栏变身信息神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Claude API Python 流式响应(Streaming)完整实战指南:从 text_stream 到事件级流控

Claude API Python 流式响应(Streaming)完整实战指南:从 text_stream 到事件级流控

人工智能AI 技能AI 评测 【免费下载链接】skills Public repository for Agent Skills 项目地址: https://gitcode.com/GitHub_Trending/skills3/skills 点击查看 免费下载 流式(Streaming)是调用 Claude API 处理长输出、长思考或高 max_to…

2026/10/1 2:31:26 阅读更多 →
PhotoPrism 集群运维实战:节点引导、注册、凭据轮换与安全边界

PhotoPrism 集群运维实战:节点引导、注册、凭据轮换与安全边界

后端前端图像处理人工智能AI 应用 【免费下载链接】photoprism AI-Powered Photos App 🌈💎✨ 项目地址: https://gitcode.com/gh_mirrors/ph/photoprism 点击查看 免费下载 本文是 PhotoPrism 集群(Cluster)功能的运…

2026/10/1 2:31:59 阅读更多 →
OpenCore Legacy Patcher:Intel 老 Mac 安装 macOS Big Sur 到 Sequoia 的全流程

OpenCore Legacy Patcher:Intel 老 Mac 安装 macOS Big Sur 到 Sequoia 的全流程

OpenCore Legacy Patcher:Intel 老 Mac 安装 macOS Big Sur 到 Sequoia 的全流程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher macOS Big Sur 及…

2026/10/1 2:30:58 阅读更多 →

最新新闻

OpenAI Agents SDK生产环境实战:从执行循环到多Agent编排

OpenAI Agents SDK生产环境实战:从执行循环到多Agent编排

先说明一点:这个系列走到第四篇,我不打算再花篇幅重复“什么是 Agent”“怎么装 SDK”这些基础内容了。前三篇已经覆盖了从环境搭建、单个 Agent 的定义、工具调用,到基本的多 Agent 协作,如果你还没读过前面那些,建议…

2026/10/1 4:50:12 阅读更多 →
LLM Agent记忆优化:hindsight事后提炼与MCP集成实践

LLM Agent记忆优化:hindsight事后提炼与MCP集成实践

1. 从“hindsight”这个词说起:为什么它值得单独拿出来做一篇文章“hindsight”这个词本身的意思很简单——事后的聪明、后见之明。但把它放到 LLM Agent 的技术语境里,它指向的东西就具体多了:Agent 在完成一轮任务之后,回过头去…

2026/10/1 4:50:12 阅读更多 →
应急物资管理系统实战:SpringBoot+Vue全栈开发避坑指南

应急物资管理系统实战:SpringBoot+Vue全栈开发避坑指南

刚接手一个应急物资管理系统项目时,我第一反应是这东西看似简单——无非就是物资出入库、库存台账、预警提醒,但真把需求聊细了才发现,背后牵扯到批次管理、有效期校验、多角色审批、多仓库调拨,还有应急场景下"物资必须找得…

2026/10/1 4:50:12 阅读更多 →
综合能源系统优化:需求响应与碳交易耦合建模全解析

综合能源系统优化:需求响应与碳交易耦合建模全解析

近年来做园区级能源规划,一个明显的变化是:业主不再只问“电够不够、气贵不贵”,而是开始追问“能不能少买碳配额”“负荷能不能跟着现货价格走”。这种问题背后,恰恰是综合能源系统从理论走向落地的分水岭——当多能互补、需求响…

2026/10/1 4:50:12 阅读更多 →
大模型模型中立架构实战:接口抽象与baseUrl路由实现多模型无缝切换

大模型模型中立架构实战:接口抽象与baseUrl路由实现多模型无缝切换

1. 为什么“模型中立”不是架构洁癖,而是生存刚需我见过太多团队在项目初期随手选了一个大模型,把调用代码硬编码在业务逻辑的各个角落,半年后想换模型时发现牵一发动全身,改一处崩三处。这不是危言耸听,而是过去两年我…

2026/10/1 4:50:12 阅读更多 →
基于SpringBoot+Vue+MyBatis+MySQL的服装生产管理系统

基于SpringBoot+Vue+MyBatis+MySQL的服装生产管理系统

前阵子整理了一套基于SpringBootVue的服装生产管理系统源码,春节前刚好利用这套骨架给一家做针织衫的中小型服装厂做过信息化改造摸底。整套系统跑下来,我觉得它特别适合两类人:一类是刚入行Java后端、想找一个能完整跑通的实战项目练手的朋友…

2026/10/1 4:49:12 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/1 1:01:17 阅读更多 →