VSCode本身不能直接运行TypeScript,真正执行靠ts-node:它在内存中调用tsc将.ts即时转为JS字符串交V8执行,不生成文件但完成类型检查、语法转换和路径解析。

VSCode 本身不能直接运行 TypeScript,所谓“无需编译”只是把编译过程藏在内存里——真正干活的是 ts-node,不是 VSCode。
为什么 ts-node 能“跳过编译”
ts-node 在 Node.js 进程启动时,用 TypeScript 编译器(tsc)把 .ts 文件即时转成 JS 字符串,再交给 V8 执行。不落地 .js 文件,但类型检查、语法转换、路径解析全都在运行前发生。
- 它读取项目根目录的
tsconfig.json,但会忽略"composite"、"incremental"等构建专用字段 - 默认不报类型错误(静默忽略),加
--files或--no-cache才启用全量检查 - 若
tsconfig.json不存在,ts-node会退化为单文件模式,路径别名、baseUrl全失效 - 遇到
import.meta.url或顶层await,需确认"target"≥"ES2022"且 Node.js 版本匹配
launch.json 调试必须带 runtimeArgs
VSCode 的调试器本质是启动一个 Node.js 进程,它默认只认 .js。要让它加载 .ts,必须通过 runtimeArgs 注入 ts-node/register 钩子。
- 配置里漏掉
"runtimeArgs": ["-r", "ts-node/register"],断点打在.ts上永远显示“未绑定” -
"program"必须指向.ts入口文件(如src/index.ts),不能写dist/index.js - 不要同时配
preLaunchTask: "tsc: build"——它会先生成.js,导致ts-node和 sourceMap 错位 - 如果用了路径别名(如
@/utils),确保tsconfig.json有"baseUrl"和"paths",且没被ts-node的-T参数跳过
Code Runner 插件的坑:它不走 tsconfig.json
Code Runner 默认用全局 ts-node,且硬编码执行命令为 ts-node --loader ts-node/esm(新版)或 ts-node(旧版),完全绕过你项目里的 tsconfig.json。
- 路径别名、
resolveJsonModule、jsx配置全部失效 - 解决方法:在 VSCode 设置里搜
code-runner.executorMap,把 TypeScript 对应项改成:npx ts-node --files - 如果终端报
Cannot use import statement outside a module,大概率是tsconfig.json里"module"设成了"ESNext",临时改成"CommonJS"更稳 - 它不支持调试(无法设断点),仅适合快速看输出结果
最易被忽略的一点:改完 tsconfig.json 后,VSCode 不会自动重载规则。必须手动 Ctrl+Shift+P → 输入 TypeScript: Restart TS server,否则编辑器提示和 ts-node 行为可能不一致。


















