给 TypeScript 编译器加上 Go 的 defer
来源:healeycodes.com — 2026-10
📋 概述
作者试着给 TypeScript 编译器加上 Go 的 defer 语句,做完后反而确信它大概不该存在。实现思路是把含 defer 的函数重写为:建一个栈,在到达 defer 时立即捕获被调函数值、接收者与实参并入栈,退出时按后进先出依次调用;异常路径下仍保证全部清理执行、保留原始错误,并用 AggregateError 聚合多个失败。语言设计上只接受调用表达式,且直接拒绝 defer await。
🔑 核心要点
- 语义对齐 Go:被调者、接收者与实参在到达 defer 时就立即捕获
- 重写为栈结构,退出时按后进先出执行清理
- 注册时机是执行到 defer,因此循环里的 defer 每次迭代都会入栈一次
- 错误规则:每个延迟调用都执行、保留原始错误、多个失败用 AggregateError 聚合
- 语法上只接受调用表达式,并直接拒绝 defer await
- 复用 tsc 已有的 AST 到 AST 变换机制,无需新增工具链
💡 金句
等我做完,我反而确信这个特性大概不该存在。
👍 0
👎 0
← 返回 Lobsters 首页