TypeScript 函数返回值类型推断:从 The Concise TypeScript Book 的 “Type from Func Return“ 到 ReturnType 与条件类型提取
文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载Function Return 中的类型Type from Func Return是 TypeScript 类型推断体系中最基础也最常被依赖的能力编译器无需显式标注就能根据函数实现自动得出其返回类型。本文以开源书籍 The Concise TypeScript Book 中该章节type-from-func-return.md印尼语版本见 type-from-func-return.md为核心展开完整覆盖其定义与示例并结合书籍仓库自身的构建管线对全书代码块做严格模式编译校验说明该能力在实践中的验证方式帮助读者掌握推断规则、显式标注的取舍以及ReturnType、条件类型infer等提取返回类型的进阶手段。一、章节定位什么是 Type from Func Return在书籍目录中该章节编号为 36紧接35. 从值推断类型Type from Value、先于37. 从模块获取类型Type from Module之后属于从已有信息派生类型这一系列知识点的中间环节见 table-of-contents.md 中的目录结构Tipe dari Nilai→Tipe dari Nilai Kembalian Fungsi→Tipe dari Modul。原文档给出的核心定义是Tipe dari Nilai Kembalian Fungsi函数返回值的类型指的是根据函数实现自动推断函数返回类型的能力它允许 TypeScript 在没有任何显式类型标注的情况下确定函数返回值所具有的类型。原文档的唯一代码示例即体现了这一点const add (x: number, y: number) x y; // TypeScript 可以推断函数的返回类型是 number这里add的参数类型x: number, y: number是显式写出的而返回类型number完全由实现x y推导得出——对两个number执行运算结果只可能是number编译器便据此将函数签名确定为(x: number, y: number) number。这正是该章节的灵魂标注最小化推断补全化。二、推断规则详解编译器如何从实现得出返回类型原文档仅以一个单表达式箭头函数为例下面将这一能力展开到更常见的各种实现形态所有例子均为 TypeScript 标准行为且在严格模式strict: true下均可通过编译。2.1 分支返回多路 return 汇聚为并集当函数体含多个return语句时编译器会收集各分支返回表达式的类型取最窄的公共结果通常是字面量类型经宽化后的并集function convert(value: boolean) { if (value) { return 1; } return no; } // 推断返回类型: string | number两个分支分别返回数值与字符串字面量1和no在函数返回类型推断中被宽化widening为number与string最终推断结果为string | number。这与同系列前一章节Type from Value讲到的宽化机制一脉相承——在 type-from-value.md 中const x x与let x x的推断差异const保持字面量x、let宽化为string已说明可变性决定宽化程度这一底层原则。而分支内若各路径类型一致则并集会被折叠为单一类型function pick(value: number | string) { if (typeof value number) { return value; } return value.length; } // 推断返回类型: number2.2 字面量宽化函数返回类型推断与变量推断的关键差异函数返回类型推断对字面量返回值会执行宽化这是初学者最容易踩的坑function getFlag() { return ok; } // 推断返回类型: string —— 而非字面量类型 ok编译器将ok宽化为string因为函数随时可能被改写、调用方不应依赖某个具体字面量是更安全的默认假设。若 API 确实需要返回有限字面量集合必须用显式标注约束function getFlag(): ok | error { return ok; }此时显式标注: ok | error覆盖了推断调用方就能基于精确的字面量并集做穷举判断。书籍在 exploring-the-type-system.md 的Pelebaran Tipe类型宽化一节系统论述了宽化方向窄类型可宽化、宽类型不可反向收窄与const修饰符的精确推断是本节内容的理论基础。2.3 异步函数推断结果自动包裹 Promiseasync function fetchId() { return 42; } // 推断返回类型: Promisenumberasync函数的返回类型推断会先把函数体返回值此处宽化为number整体包裹进Promise得到Promisenumber。这意味着await fetchId()的结果类型是number无需手动标注。2.4 无返回语句推断为 voidfunction log(message: string) { console.log(message); } // 推断返回类型: void没有任何return的函数编译器推断其返回类型为void隐含返回undefined。这体现了推断的从实现出发原则返回类型不是被声明出来的而是从所有可能执行路径上能观察到的值中归纳出来的。2.5 上下文类型Contextual Typing标注决定推断边界当函数被显式标注为某个类型时参数与返回值的推断会受上下文约束而非自由推断。书籍在 exploring-the-type-system.md 的Inferensi Lebih Lanjut进一步推断一节演示了类似机制addEventListener回调参数被推断为MouseEvent因为其类型来自 lib 声明。对函数赋值场景type Handler (event: { code: number }) number; const handler: Handler event event.code 1;此处event的类型完全来自Handler的上下文{ code: number }箭头函数体只负责让返回值满足number。上下文类型与返回类型推断是同一套推断机制的两面前者用已知类型反向约束参数后者从实现正向归纳结果。三、显式标注 vs 自动推断何时该写返回类型推断带来简洁但也把类型写死在实现上。书籍原章节的示例展示了推断的便利而工程实践中显式标注返回类型有明确价值API 稳定性库导出函数的返回类型是公共契约。实现从return ok改成return ok! 推断类型虽不变都是string但若从返回字面量改为返回对象推断类型会随之漂移所有调用方被动受影响。显式标注则把契约与实现解耦——实现可以偏离标注此时编译器报错提示开发者修正而不是静默改变契约。文档价值(x: number): number x y中的: number让读者不进入函数体即可确认返回类型。抑制不必要的宽推断如 2.2 节所示需要精确字面量并集时必须显式标注。反过来内部工具函数、单表达式工具、以及返回类型一眼可知的场景const add (x: number, y: number) x y;依赖推断更干净——这也正是原章节示例所示范的风格。四、进阶从函数类型中提取返回类型原文档讨论的是推断编译器替你算而类型系统还提供了反向能力从已有的函数类型中主动提取返回类型。书籍在 type-manipulation.md 的Tipe Utilitas工具类型一节给出了ReturnTypeT的完整定义与示例——从函数类型 T 中提取返回类型type Func (name: string) number; type MyType ReturnTypeFunc; // numberReturnTypeT可以作用于任何函数类型的值const double (x: number) x * 2; type D ReturnTypetypeof double; // number同一章节还展示了条件类型 infer的手写版本书籍以提取参数为例type ExtractParamT T extends (param: infer P) any ? P : never;同样的机制指向返回值位置type RetT T extends (...args: any[]) infer R ? R : never; type R2 Ret(a: string) number; // number type R3 Retstring; // never非函数类型走 never 分支infer在条件类型中的作用是从依赖它的类型中抽取推断泛型参数这一点书籍专设章节讲解infer-type-inference-in-conditional-types.mdtype ElementTypeT T extends (infer U)[] ? U : never;即从数组类型中抽取元素类型。可见提取返回类型与提取数组元素类型在机制上是同构的infer绑定到匹配位置的类型extends匹配成功则取之失败则落入never分支。这三条线索——推断第二章、ReturnType内置工具类型、条件类型infer手写机制——构成了从函数视角获取类型的完整工具链。五、仓库工程视角书中的代码示例如何保证类型正确The Concise TypeScript Book 仓库的tools/目录包含一套对全书19 种语言版本见 tools/i18n.ts 中的Language枚举其中包含id_ID代码块做真实编译校验的管线这也是本章节内容可验证性的来源tools/compile.ts 中的extractCodeSnippets约 L60-L80使用marked词法分析每个语言的合并 Markdown筛选出lang typescript的代码块isTypeScriptCodeL56写入临时.ts文件随后compileAndReport以如下编译器选项逐一编译tools/compile.ts#L100-L108{ noEmitOnError: true, noImplicitAny: true, target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.CommonJS, moduleDetection: ts.ModuleDetectionKind.Force, noUnusedLocals: false, strict: true }即本书每一段 TypeScript 示例包括本章节的const add (x: number, y: number) x y;都在strict: true与noImplicitAny: true下经过ts.createProgramprogram.emit()的完整诊断ts.getPreEmitDiagnostics合并发射诊断L33-L35任何一处推断不符合预期例如误判返回类型导致赋值错误都会以非零退出码失败exitScriptL21-L27。tools/lint.ts 配合 tools/config.ts 中的CODE_BLOCK_TS_REGEX /typescript([\s\S]*?)/g正则用 Prettier 的typescript解析器逐块检查格式确保示例代码符合.prettierrc规范。这套管线从仓库工程的角度印证了本文第二、四章所述推断行为的确定性返回类型推断不是文档层面的口头约定而是编译器在严格模式下可复现、可自动验证的机制。六、小结核心能力TypeScript 依据函数实现自动推断返回类型无需显式标注多分支返回汇聚为并集字面量返回值会被宽化async函数结果自动包裹为Promise无返回语句推断为void。取舍原则公共 API 建议显式标注返回类型以固定契约并表达字面量并集内部简洁函数可依赖推断原章节示例风格。进阶提取ReturnTypeT工具类型与条件类型T extends (...args) infer R可从既有函数类型反向提取返回类型与书籍infer章节的数组元素提取同构。验证依据书籍仓库 tools/compile.ts 管线以strict: true编译全书代码块保证所有示例含本章在严格模式下类型安全相关章节脉络可继续参阅 table-of-contents.md、type-from-value.md、type-manipulation.md 与 infer-type-inference-in-conditional-types.md。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐The Concise TypeScript Book函数返回类型推断Type from Func Return深度解析The Concise TypeScript Book函数返回类型推断Type from Func Return深度解析 Type from Func R文档教程The Concise TypeScript Book 精读函数返回类型推断Type from Func Return实战指南The Concise TypeScript Book 精读函数返回类型推断Type from Func Return实战指南 本指南聚焦《The Con文档教程The Concise TypeScript Book 精讲函数返回类型推断Type from Func Return原理与实战The Concise TypeScript Book 精讲函数返回类型推断Type from Func Return原理与实战 本篇技术指南以开源仓库文档教程上一篇Hermes 编程助手接入 Hindsight为你的代码库构建跨会话持久记忆下一篇KubeSphere Frontend Forge 前端扩展FrontendExtension生命周期操作指南创建、更新、强制重建、下载与安全删除创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Atlas 300V 24G推理卡实战:从YOLO模型转换到生产部署

Atlas 300V 24G推理卡实战:从YOLO模型转换到生产部署

最近被问得最多的一个问题,就是标题里这个:Atlas 300V 24G到底是什么卡,能不能拿来跑YOLO。不少人是看二手市场便宜、24G大显存诱人,想买来当推理卡用,但又怕踩坑。我先给结论:它确实是运算加速卡&#xff…

2026/9/25 17:24:39 阅读更多 →
12G显存跑27B模型:量化、KV Cache优化与投机采样实战

12G显存跑27B模型:量化、KV Cache优化与投机采样实战

1. 12G显存跑27B模型这件事,先算一笔账再动手27B参数的模型,如果按FP16精度加载,光权重就要占掉54GB显存,这还没算KV Cache和中间激活值。12G显存想跑起来,第一反应肯定是"不可能",但量化技术就是…

2026/9/25 17:24:39 阅读更多 →
昇腾Atlas 300V上部署YOLO目标检测:从环境搭建到性能调优

昇腾Atlas 300V上部署YOLO目标检测:从环境搭建到性能调优

1. 项目概述1.1 先来回答一个最常见的疑问:Atlas 300V到底是不是运算加速卡最近后台收到不少消息,都在问同一个问题:“Atlas 300V 24G 是运算加速卡吗?”这个问题乍一看简单,但真正回答起来却有很多细节值得展开。先说…

2026/9/25 17:24:39 阅读更多 →

最新新闻

Datawhale组队学习-深度学习笔记(一)

Datawhale组队学习-深度学习笔记(一)

文章目录第 1 章 神经网络简介第 2 章 PyTorch 入门总结第 1 章 神经网络简介 神经网络的学习,并不是灌输规则,也不是理解概念,而是通过反复调整参数,让函数逐步逼近我们期望的映射关系。 具体来说,神经网络的学习过程…

2026/9/25 18:04:04 阅读更多 →
轻量级校验库ValidX与Maven/Gradle的集成配置与排障实践

轻量级校验库ValidX与Maven/Gradle的集成配置与排障实践

1. 集成思路与方案选型1.1 ValidX是什么,为什么需要单独写集成指南先说清楚一件事:ValidX不是一个大而全的框架,它是一套专注于参数校验的轻量级工具库。很多团队在项目里已经用上了Spring的Validated或者Hibernate Validator,但遇…

2026/9/25 18:04:04 阅读更多 →
深入Linux USB协议栈:URB、枚举与驱动开发实战

深入Linux USB协议栈:URB、枚举与驱动开发实战

写Linux驱动的人,大概都绕不开USB。不管是做嵌入式、搞内核开发,还是日常接个U盘、鼠标、USB转串口调试单片机,背后都有一套成熟但不太容易看懂的机制在干活——这就是Linux内核里的USB协议栈框架。很多人能调通一个USB设备驱动,但…

2026/9/25 18:04:04 阅读更多 →
CLI-Anything 项目架构解析:用 TaoToken 统一 Key 打通 CLI Agent 配置链路

CLI-Anything 项目架构解析:用 TaoToken 统一 Key 打通 CLI Agent 配置链路

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

2026/9/25 18:04:04 阅读更多 →
Substrate深度解析:从区块链框架到材料衬底的底层选型逻辑

Substrate深度解析:从区块链框架到材料衬底的底层选型逻辑

1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个标题,很多人会愣一下——这词太泛了。字面意思是“基底”“底层”“基质”,在生物学里指培养基,在材料学里指衬底,在区块链圈子里则特指那条著名…

2026/9/25 18:04:04 阅读更多 →
免费CRM总折腾?自建私有化CRM全流程实战——以DeskcommCRM为例

免费CRM总折腾?自建私有化CRM全流程实战——以DeskcommCRM为例

搞了这么多年软件,我见过太多团队在CRM选型上反复折腾:一开始图省事用免费CRM,业务跑起来后数据越来越多,权限一复杂就发现平台带不动;想自己写一套专门给销售和客服用的后台,又舍不得那个开发成本。后来我…

2026/9/25 18:03:03 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →