vscode本身不运行typescript,仅提供编辑、类型检查和调试支持;真正执行需tsc编译为js后由node.js运行,或借助ts-node在内存中即时转译。

VSCode 本身不运行 TypeScript,它只编辑、校验、调试;真正执行必须靠 tsc 编译后由 Node.js 运行,或用 ts-node 在内存中即时转译。你看到的“点一下就跑”,背后不是魔法,而是配置链没断——断一处,console.log 就卡在终端里不动。
为什么 tsc 编译后没生成 .js 文件?
这是最常卡住的第一步:写了 tsc,终端没报错,但 dist/ 下空空如也。
-
"noEmit": true(或未设)会禁用输出,检查tsconfig.json的compilerOptions里有没有这一项 -
"outDir"和"rootDir"必须成对显式设置,比如"outDir": "./dist"+"rootDir": "./src";否则tsc不知道从哪读、往哪写 -
"include"路径写错会导致“没文件可编译”:写成"src/**"(缺/*)或"src\**\*"(反斜杠,在 JSON 里无效)都不行,必须是"src/**/*" - 临时验证配置是否生效:终端执行
tsc --noEmit false,强制开启输出,绕过tsconfig.json里的noEmit设置
怎么让 VSCode 调试器直接跑 .ts 文件?
靠的是 launch.json + ts-node,不是 VSCode 原生能力。配错一个字段,F5 就报 Cannot find module 'ts-node' 或路径不存在。
- 先装依赖:
npm install --save-dev ts-node @types/node -
.vscode/launch.json里配pwa-node类型,"program"指向你的入口.ts文件,例如"${workspaceFolder}/src/index.ts" - 关键要加
"runtimeArgs": ["-r", "ts-node/register"],否则调试器根本不知道用ts-node加载 - 别混用
preLaunchTask: "tsc: build"——那是为纯tsc编译准备的,和ts-node冲突,删掉
为什么 VSCode 底部显示 TS 版本但调试仍报错?
右下角的 TypeScript 版本号只说明语言服务加载了,不代表调试器也用了同一套环境。
- 右下角点击版本号 → 选
Use Workspace Version,确保编辑器提示和tsc行为一致 - 但调试器(Node.js 进程)只认你
package.json里装的ts-node,和 workspace TS 版本无关 - 如果
ts-node报Cannot find module 'xxx',大概率是tsconfig.json里漏了"resolveJsonModule": true,或"baseUrl"/"paths"没配对 - 每次改完
tsconfig.json,按Ctrl+Shift+P→ 输入TypeScript: Restart TS server,否则编辑器缓存旧规则
用 Code Runner 插件一键运行 .ts 文件要注意什么?
它走的是 tsc $fileName && node $fileNameWithoutExt.js 路径,看着简单,但容易在路径和编译时机上翻车。
-
settings.json里"code-runner.executorMap"的 TypeScript 条目必须写全:"typescript": "tsc $fileName && node $fileNameWithoutExt.js" - 它默认不读
tsconfig.json,所以tsc是以单文件模式运行,outDir、include等配置全失效——适合单文件小实验,不适合项目 - 如果
$fileName含子目录(如src/main.ts),$fileNameWithoutExt会变成src/main,但tsc默认输出到当前目录,node src/main.js就会报错 - 想让它可靠,要么把
.ts文件放在根目录,要么改 executorMap 为:"tsc -outDir dist $fileName && node dist/$fileNameWithoutExt.js"
最易被忽略的其实是 sourceMap 和 outFiles 的匹配关系:tsconfig.json 开了 "sourceMap": true,launch.json 的 outFiles 却写成 ["./dist/**/*.js"],而实际输出在 ./build/,断点就永远“未绑定”。路径差一级,调试就失效。











