OC
把 Go 的 defer 搬进 TypeScript:语法能复制,错误模型复制不了
科技 · 2026-08-03 · 开发者工具 · 阅读 6

把 Go 的 defer 搬进 TypeScript:语法能复制,错误模型复制不了

作者:林岚|OC 开发者生态编辑

开发者 Andrew Healey 修改 TypeScript 编译器,给语言加入类似 Go 的 defer 语句,并记录了从解析器、类型检查到 JavaScript 转换的完整过程。实验文章最后得出的结论却是:实现之后,他反而不打算把这项语法带进生产项目。

一句话结论:defer 的后进先出清理很容易解释,难的是 JavaScript 已有异常、异步和资源管理语义;复制一个关键词,必须同时决定多次失败时到底保留哪个错误。

实验实现会在执行到 defer 时立刻捕获函数、接收者和参数,再把调用压入当前作用域的清理栈。控制流走到哪里,就登记哪些清理动作;离开作用域时按后进先出顺序执行。这样能自然表达“打开后关闭”“加锁后解锁”等成对操作。

编译器改动并不只是在解析器里认出新词。TypeScript 需要新的 AST 节点、语法检查、类型检查和转换逻辑,还要确保不同退出路径都执行清理。异步版本更复杂:多个清理任务是串行等待还是并行,清理失败是否继续,都会改变程序行为。

函数体错误与多个清理错误需要明确合并而不能静默覆盖

作者选择保留函数体原始错误,同时继续执行全部清理,并把清理失败汇总进 AggregateError。这是一种合理政策,却不是 Go 或现有 JavaScript 自动给出的答案。若最后一个清理错误覆盖业务错误,调试信息会丢失;若遇到第一个错误就停止,后面的资源又可能泄漏。

TypeScript 其实已经支持 JavaScript 的显式资源管理:usingawait using 会调用对象的 Symbol.disposeSymbol.asyncDispose,并通过 SuppressedError 处理主体与清理同时失败。它比任意函数 defer 更受约束,但也因此更容易形成统一协议和库生态。

这次实验最有价值的不是新语法,而是暴露隐藏设计。一个看似简单的便利功能会把作用域、闭包捕获、异常优先级和异步顺序全部拉进语言规范。问题不在能不能做,而在团队是否愿意长期维护另一套清理语义。

关键事实

  • 实验内容:修改 TypeScript 解析器、AST、检查器和转换器以支持 defer
  • 执行语义:登记时捕获调用信息,离开作用域时后进先出执行
  • 错误策略:保留主体错误,继续清理并聚合清理阶段失败
  • 现有替代:TypeScript 已支持 usingawait using 和显式资源管理协议

OC 判断

语法糖只有在全语言错误模型里才是甜的。对 TypeScript 来说,优先使用标准 using 协议比维护私有编译器分支可靠;确实需要任意延迟调用时,普通 try/finally 虽然啰嗦,却不会制造新的语言方言。

为什么重要

参考来源

相关阅读

基于标题、摘要和正文内容自动匹配。

更多科技

评论

围绕这篇文章补充信息、提出问题或分享观察。

0
暂无评论。

发表评论

继续看看 OC 用户围绕这个话题说了什么、做了什么。

相关碎碎念

更多

正在做OC产品频道,支持独立开发者提交自己的app,网站,在OC得到宣传和外链。基础功能已经实现,还有一堆在路上。我们独特的是有一个能力让你把产品的用户写的文章视频也可以列在你的产品页下方。方便更多用户了解,这不是想替代你自己的产品页面,而是帮你把做每个产品页各种复杂的互动都自动化,这个产品页还是可以导流到你自己的产品页的

tinyfool 1 2

OC有3万多注册用户,但是这些人哪些活跃,哪些不活跃?哪些发过帖子,哪些没有,其实以前都很麻烦去计算。这两天想了下,在后台,加入了注册用户细分的界面,然后一下子一目了然了。图片是测试服务器的测试数据,跟真实OC的数据不同步,但是大概可以看一个感觉了。

tinyfool 0 0

最近越来越多思考,我们跟agent的关系,比如我最近用blender mcp很多,基本上我算是会用blender的,但是老记不住很多热键,以前我可以做很复杂的模型,但是要是不是的去查blender的操作热键。现在我完全不参与模型的建模,只让codex帮我生成。 但是我还是在查blender的热键,我现在需要的是numpad .这样聚焦到一个对象的方法,我需要的是numpad /这样的方法来把除了选中的对象,其他都隐藏的热键。 换言之,我现在需要高效的人工视觉复检blender mcp的成果,这是我对自己目前blender能力的需求了。

tinyfool 2 0

相关帖子

更多

你们的Codex额度提前耗完了没?戒断反应如何?

<p>我在第三天就消耗了只剩1%,忍了一天,然后今天干脆用这最后的1%,开着5.6 Sol 极高 强推我一个提示词笔记本应用的功能落地。最终用时3小时,居然还是跑完了。但是现在还是出现一些戒断反应,感觉啥也做不了,就无精打采的,困。</p> <p>我做了一个Prompt Notebook,专门用来收藏或者记录自己手搓的生图提示词。带Chrome一键收藏插件。支持AI优化提示词。支持提示词中提取常用字段作为提示词百科词汇。也自带生图功能用来测提示词。但是要搭配Cloudflare R2+Worker的图床。</p> <p>今天主要是做一个AI模特的资产库。将常用的AI模特固定下来,进行身份设定,以及模特的一些角色定妆图。之后生图可以直接调用AI模特自动作为垫图。</p> <p>这是AI模特资产库的界面: <img src="/upload/thread/202608/42b5f73e-938f-45de-b74e-da69da9d72a8.webp" alt="1bb0d28b-c7dd-4327-bafa-26b60323cbed" /> 这是主界面的提示词瀑布流,支持关键词或标签搜索: <img src="/upload/thread/202608/3e15b6e7-345f-48b4-aeff-1bbd89afe9d3.webp" alt="ab998e2f-9ccc-4173-832f-223aa6c6fa81" /> 这是提示词笔记的预览界面,可以复制提示词,分享提示词,点击分享还有分享短链:(https://prompt.jintao.co.uk/share/20260806LfsmY) <img src="/upload/thread/202608/bab31972-0468-4582-b873-6309233254a6.webp" alt="20260806-201213" /> 可惜现在没额度了,我又不想换模型折腾。现在还有些界面细节和小功能需要落地完善,可能还要虫子要抓。弄好了,打算放GitHub开源。</p> <p>有朋友想试试的么?</p>

shynloc 2 4

重返OurCoders

<p>从2014年以来好久没逛过这个谈论了,不知道这个谈论的运营现在怎么样,开发人员是不是原来的人,前端UI做得不太好</p>

梁建溢 4 18

测试OurCoders能否发布照片

<p>今天小区的彩虹🌈<img src="https://share.icloud.com/photos/0ebtFydNy8r_gJETON61u4Ybg" alt="图片说明" /></p> <p>看来不能直接发照片,可以把iCloud Link的功能派上用场!</p>

梁建溢 15 45