vscode 默认不生成 .js 文件,需确保本地 tsc ≥5.0、正确配置 tsdk 路径、tsconfig.json 含 outdir/rootdir、通过 tasks.json 启用 tsc --watch 或用 nodemon+ts-node 实现热重载。

VSCode 默认不生成 .js 文件,装了 TypeScript 插件也没用——你看到的“没报错”,只是编辑器在做类型检查,tsc 根本没跑。
确认 tsc 可用且版本 ≥ 5.0
VSCode 不自带可执行的 tsc,它只调用你本地装的编译器。终端里运行 npx tsc --version 必须输出类似 5.4.5 的数字,低于 5.0(比如 4.9.5)会导致 moduleResolution: "bundler"、satisfies 等新特性被忽略。
推荐项目级安装:npm install --save-dev typescript。全局安装容易和多项目冲突,而且 VSCode 默认不优先用全局 tsc。
装完后,必须在 VSCode 工作区设置里加这一行:"typescript.tsdk": "./node_modules/typescript/lib",否则编辑器可能继续用内置旧版语言服务,和实际编译行为不一致。
改完设置后,务必手动重启 TS 服务:Ctrl+Shift+P → 输入 TypeScript: Restart TS server → 回车。
tsconfig.json 必须有 outDir 和 rootDir
空的 {} 或只有注释的 tsconfig.json 是无效的。tsc 会降级为单文件编译,outDir、include 全部失效,.js 压根不会生成。
最小可行配置(放在项目根目录):
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"sourceMap": true,
"inlineSourceMap": false,
"strict": true
},
"include": ["src/**/*"]
}
outDir 和 rootDir 必须配对:源码在 src/,就得写 "rootDir": "./src";否则 tsc 可能误扫 node_modules 或报 TS18003: No inputs were found。
include 比默认注释掉的 files 更可靠,尤其有子目录时;不写 include 又没 files,tsc 就找不到任何输入。
删掉所有以 // 开头的行——JSON 不支持注释,tsc 解析失败直接退出。
用 tasks.json 启动 tsc --watch 后台任务
tsc --watch 是唯一能实现“保存即编译”的机制,但它不是 VSCode 自带功能,必须通过 .vscode/tasks.json 显式声明,并设 "isBackground": true,否则任务一结束就停,后续修改不会触发编译。
典型配置(.vscode/tasks.json):
{
"version": "2.0.0",
"tasks": [
{
"label": "tsc: watch",
"type": "shell",
"command": "npx tsc",
"args": ["--watch"],
"group": "build",
"isBackground": true,
"problemMatcher": ["$tsc-watch"]
}
]
}
problemMatcher 必须是 ["$tsc-watch"],否则错误提示不显示在 Problems 面板;isBackground 必须为 true,否则 --watch 不会持续运行。
首次启用要手动触发:Ctrl+Shift+B → 选 tsc: watch。终端应显示 Found 0 errors. Watching for file changes. —— 这才真正开始监听。
别指望保存自动触发任务:VSCode 不默认绑定保存事件到构建任务,得靠这个后台进程自己监听文件系统变化。
想改完就执行?nodemon + ts-node 更顺
tsc --watch 只编译,不执行;ts-node 能直接跑 .ts,但默认不监听变化。
合体方案才是开发流舒适区:
- 安装:
npm install --save-dev ts-node nodemon - 加脚本到
package.json:"dev": "nodemon --exec ts-node src/index.ts" - 运行:
npx run dev
效果:改保存 → ts-node 实时转译 → nodemon 自动重启进程。调试时不用切到 dist/ 目录,也不用等 tsc 输出再手动 node。
注意:ts-node 不读 tsconfig.json 的 outDir,它只做内存内转译;所以它和 tsc --watch 是两套逻辑,别混用同一份配置去强求一致。
最常被忽略的是:改了 tsconfig.json 或装了新依赖后,tsc --watch 进程不会自动 reload,得手动终止再 Ctrl+Shift+B 重开一次。










