vscode本身不运行typescript,仅编辑、检查、调试;真正执行需tsc编译后由node.js运行,或用ts-node即时转译。未配对工具链会导致f5卡住、console不输出、断点失效。

VSCode 本身不运行 TypeScript,它只编辑、检查、调试;真正执行必须靠 tsc 编译成 JS 后由 Node.js 运行,或用 ts-node 在内存里即时转译。没配对工具链,F5 就卡住、console.log 不输出、断点打不进都是必然结果。
tsc 编译后用 node 运行:最稳但多一步
适合需要产出可部署 JS 文件的场景(比如 CLI 工具、后端服务),类型检查 + 输出 JS + 独立运行三者分离清晰。
-
tsc默认只做类型检查,不生成.js文件——检查tsconfig.json中"noEmit": false(显式设为false,不能只留空或注释掉) -
"outDir"和"rootDir"必须成对设置且路径不重叠,例如"outDir": "./dist"+"rootDir": "./src";若都设为"./",tsc -w可能循环写入或拒绝编译 -
"include"路径必须用正斜杠+通配符,["src/**/*"]才有效;写成["src\**\*"](Windows 反斜杠)或["src/**"](缺末尾/*)会导致部分文件不参与编译 - 用
npx tsc -w监听保存自动编译,但注意:它不会重启node进程——JS 文件变了,正在跑的进程仍用旧代码,需手动Ctrl+C再node ./dist/index.js
ts-node 直接运行 .ts:开发阶段首选,但默认不校验类型
ts-node 是开发期“跳过编译”的快捷方式,不是 tsc 替代品,行为差异明显——它默认静默忽略类型错误,any 泛滥也照跑。
- 必须同时安装:
npm install --save-dev ts-node @types/node,漏掉@types/node会导致process、__dirname报错 - 基础运行:
npx ts-node src/index.ts,快但无类型检查;加--no-cache --files才强制全量校验:npx ts-node --no-cache --files src/index.ts -
ts-node忽略tsconfig.json中的"composite"、"incremental"、"extends"字段,别指望它复现tsc构建逻辑 - ESM 项目(
"type": "module")需额外加--esm参数,且要求 Node.js ≥18.12,否则报错ERR_REQUIRE_ESM
launch.json 断点调试必须匹配 sourceMap 路径
VSCode 调试器靠 .js.map 把运行时位置映射回 .ts 源码,outFiles 配错,断点就永远是“未绑定”。
-
tsconfig.json必须同时设"sourceMap": true和"outDir",否则生成的.map文件路径不对,VSCode 找不到 - 如果走
tsc编译流程,launch.json的"program"必须指向编译后的.js(如"${workspaceFolder}/dist/index.js"),不是.ts文件 - 如果走
ts-node调试,launch.json要换用"runtimeExecutable": "npx"+"runtimeArgs": ["ts-node", "--project", "./tsconfig.json"],否则断点无效 - 每次改完
tsconfig.json,务必按Ctrl+Shift+P→TypeScript: Restart TS server,否则旧缓存会让断点跳偏
VSCode 右下角 TypeScript 版本号 ≠ 调试器用的版本
右下角状态栏点击 TypeScript 版本号选 Use Workspace Version,只影响编辑器提示和语言服务;调试器(Node.js 进程)只认你 package.json 里装的 ts-node,和 workspace TS 版本无关。
- 确保项目已安装
typescript到devDependencies:npm install --save-dev typescript - 若
node_modules/typescript存在但未被识别,可在 VSCode 设置里手动指定typescript.tsdk路径,比如./node_modules/typescript/lib - 常见现象:
tsc终端能跑通,但 VSCode 里全是红波浪线——这不是环境没搭好,而是 TypeScript Server 没读对配置
最易被忽略的点:tsconfig.json 里 "noEmit": false 和 "sourceMap": true 必须显式存在,且 "outDir" 与 "rootDir" 路径不能交叉;否则无论怎么配 launch.json 或装多少插件,编译不出 JS、断点不生效、F5 直接失败,都是确定性结果。











