Bun 可直接运行 TypeScript 文件,无需编译和额外配置。它内置转译器,仅移除类型注解、支持顶层 await 和 ESM,但不执行完整类型检查,也不读取 tsconfig.json 控制行为。

直接用 bun run 就能执行 TypeScript 文件,无需编译、无需额外配置,比 ts-node 更快更轻——前提是你的项目已安装 Bun 且文件符合 Bun 的类型解析规则。
确认 Bun 已安装并可用
Bun 必须是系统 PATH 中可调用的命令,不是只装在某个项目里。运行 bun --version 能输出版本号(如 1.1.17)才算就绪。如果报错 command not found,说明没装或没加到环境变量;别用 npm install -g bun,官方推荐用官网脚本安装:curl -fsSL https://bun.sh/install | bash,然后重启终端。
- Windows 用户注意:PowerShell 或 CMD 需手动把
~\AppData\Local\bin加进系统 PATH - macOS / Linux 用户装完后通常要执行
source ~/.bashrc或source ~/.zshrc - VSCode 内置终端可能缓存旧 shell 环境,关掉再重开终端才能识别新安装的
bun
bun run 直接执行 .ts 文件的限制
Bun 默认支持顶层 await、ESM 模块、.ts 扩展名,但不自动处理 declare module、复杂路径映射或 /// <reference types="..."></reference>。它只做“够用”的类型检查——仅校验语法和基础类型,不走完整 TypeScript 编译流程。
- 能跑通的代码:普通函数、类、接口、import/export(含相对路径和 node_modules)
- 会失败的场景:
import "lodash-es"但没装包;import("./utils")动态导入未启用"module": "es2022";用了const enum(Bun 不内联) - 错误提示常见为:
Cannot find module 'xxx'或ReferenceError: xxx is not defined,不是 TS 类型错误,而是运行时解析失败
如何让 bun run 正确加载 tsconfig.json
Bun 不读取 tsconfig.json 控制运行行为,但它会在启动时检查该文件是否存在,并据此决定是否启用类型检查(仅警告,不中断执行)。真正影响行为的是 compilerOptions.module 和 compilerOptions.target ——Bun 要求它们是 "es2020" 及以上,否则可能拒绝加载某些语法(如 ??=、export * as ns from)。
- 推荐最小配置:
{"compilerOptions":{"target":"es2022","module":"es2022"}} - 不要设
"module": "commonjs":Bun 默认按 ESM 解析,设成 CJS 会导致require报错或exports未定义 -
"noEmit": true没意义:Bun 不生成 .js 文件,这个选项纯属干扰
调试时怎么配合 VSCode 的 launch.json
VSCode 的 Node.js 调试器不认识 bun,不能直接选 “Node.js” 类型。必须用 type: "pwa-node" 并显式指定 runtimeExecutable 指向 bun 可执行文件路径。
- 在
.vscode/launch.json中写:{ "version": "0.2.0", "configurations": [ { "name": "Run with Bun", "type": "pwa-node", "request": "launch", "runtimeExecutable": "bun", "args": ["run", "${file}"], "console": "integratedTerminal" } ] } -
${file}是当前打开的 .ts 文件路径,bun run会自动 resolve 并执行 - 断点只在源码行生效(不是 .js),但 hover 查看变量值有时不准——Bun 的 sourcemap 支持还在完善中,复杂泛型或装饰器场景下类型信息可能丢失
真正麻烦的不是启动命令,而是类型提示和重构支持:VSCode 的 TS 语言服务默认对接 tsserver,和 Bun 运行时无关。你写错类型,编辑器会标红,但 bun run 仍可能跑起来(只要 JS 语法合法)。这点容易让人误判代码健壮性。


















