把Go的defer塞进TypeScript编译器
Adding Go's Defer to the TypeScript Compiler
我本想尝试在TypeScript编译器中实现Go语言的defer语句,看看难度如何,但做完后却确信它不该存在。Go的defer能优雅地处理资源清理,而TypeScript缺乏严格等价物,通常只能依赖try/finally,代码显得笨拙。我通过修改tsc编译器,将defer语句转换为JavaScript中的栈式清理逻辑,完美复刻了Go的语义:立即捕获调用者、接收者和参数,并在函数退出时按逆序执行。然而,随着对错误聚合、异步执行等边缘情况的深入处理,我意识到TypeScript中异常是控制流而非值,这使得defer的引入变得异常复杂。最终,ECMAScript的Explicit Resource Management提案提供了更自然的替代方案,用using关键字和Disposable接口解决了资源管理问题,这比强行移植defer更符合JavaScript的生态。
讽刺的是,实现defer的过程反而让我确信它不该属于TypeScript。