TypeScript 中的 isolatedModules

说明 isolatedModules 为什么常用于 Babel、SWC、esbuild 这类单文件转译流程,以及它会提前暴露哪些跨文件语义问题。

#tech / dev #resource / typescript #type / concept #status / growing

[!info] related notes

TypeScript 中的 isolatedModules

一句话定义

isolatedModules 用来提前检查:这份代码是否能被“逐文件独立转译”的工具安全处理。

核心机制 / 工作原理

很多现代工具链并不会像 tsc 一样先构建整个 TypeScript program,再统一分析所有文件。

它们更像是:

  • Babel
  • SWC
  • esbuild

这种一份文件一份文件地转译。

开启:

{
  "compilerOptions": {
    "isolatedModules": true
  }
}

后,TypeScript 会对那些“只有跨文件全局信息才能正确理解”的写法提前报警。

最小例子 / 最小场景

这在以下项目里尤其常见:

  • noEmit: true,由 bundler 负责真正转译
  • React / Vue / Vite 项目
  • Babel / SWC 驱动的 app 项目

边界与易混淆点

它不是更严格的类型系统

官方文档明确说明,这个选项本身并不改变代码的运行行为。

它更像是一组“单文件转译兼容性检查”。

它会提前暴露某些 tsc 能理解、但单文件转译器难处理的写法

官方文档举到的典型问题包括:

  • 导出一个纯类型名称
  • 在非模块脚本里使用 namespace
  • 引用 ambient const enum

这些问题本质上都和“转译器拿不到完整 program 信息”有关。

bundler 项目里经常值得开启

如果真正负责输出的是 Babel、SWC、esbuild 或框架内置转译器,这个选项通常能更早暴露兼容性边界。

参考信息

创建于 2026/5/15 更新于 2026/5/27