webstorm 的「enable typescript compiler」仅启用类型检查,不生成.js文件;必须配置file watcher调用本地tsc并严格遵循tsconfig.json,否则静默失败。

WebStorm 本身不自动编译 TypeScript 生成 .js 文件,哪怕你写了 tsconfig.json、装了 typescript、甚至开了「TypeScript Compiler」开关——它只做类型检查和语言服务,不写文件。真要保存即出 .js,必须靠 File Watchers 显式调用 tsc,且路径、配置、触发逻辑全得对齐,否则静默失败。
为什么「Enable TypeScript Compiler」勾了也没用
这个开关(Settings → Languages & Frameworks → TypeScript)只控制 WebStorm 内置的 TS Server 是否监听文件做类型校验、跳转、补全等,它不执行编译动作,也不会生成任何 .js 或 .js.map。很多人误以为勾上就完事,结果改完 .ts 保存,目录里还是没 .js——不是插件坏了,是根本没走编译流程。
- 它不读
tsconfig.json的outDir、emitDeclarationOnly等输出相关配置 - 它不写磁盘,只在内存里做 AST 分析
- 即使你删掉
tsconfig.json,这个开关依然能工作(只是类型检查变弱)
File Watcher 必须选「tsconfig.json」,别选「TypeScript」
旧教程常让你点 + → 「TypeScript」,然后手动填 tsc 路径和参数。这方式硬编码目标版本、sourceMap 开关等,完全绕过 tsconfig.json,导致你改了 "target": "ES2020" 或加了 "jsx": "react-jsx",编译结果却不变。
- 正确做法:+ → 选
tsconfig.json(不是TypeScript) -
Working directory必须设为项目根目录(即tsconfig.json所在路径),否则tsc找不到配置 -
Arguments填--project $ProjectFileDir$/tsconfig.json --noEmit false --skipLibCheck true,显式委托给配置文件驱动 - 如果
tsconfig.json里用了"composite": true,务必同时加"incremental": true,否则每次保存都全量重编
「Cannot write file because it would overwrite input file」怎么破
这是 File Watcher 配置里最典型的路径冲突错误,本质是 tsc 试图把编译结果写回和源文件同一目录,比如 src/index.ts → src/index.js。TS 编译器拒绝这种覆盖。
- 检查
tsconfig.json是否有"outDir": "./dist"(不能是"."、"./src"或"./src/dist") -
outDir目录不能嵌套在src下,否则可能触发循环编译(Watcher 检测到新.js又触发一次) -
Output paths to refresh必须填具体路径,例如:$ProjectFileDir$/dist/$FileNameWithoutExtension$.js:$ProjectFileDir$/dist/$FileNameWithoutExtension$.js.map,不能留空或写模糊通配 - 确保
tsconfig.json中没有"outFile"(它用于单文件合并,和outDir冲突)
编译器路径必须指向本地 node_modules/typescript/lib/tsc.js
WebStorm 默认不信任全局安装的 tsc(哪怕终端里 tsc -v 正常)。它需要明确知道用哪个 tsc.js,且优先认本地包。
- 先在项目根目录运行
npm install typescript --save-dev - Settings → Languages & Frameworks → TypeScript →
TypeScript version下拉框,手动选中Project preferences → node_modules/typescript/lib/tsc.js - 如果下拉列表为空,点右侧刷新按钮;仍无,去终端执行
ls node_modules/typescript/lib/tsc.js确认路径存在且可读 - 别选
Bundled或Global—— 它们要么版本老旧,要么根本找不到tsconfig.json里的扩展类型(如vite/client)
真正稳定的自动化编译,从来不是靠 WebStorm 自带开关,而是靠 File Watcher 精确绑定本地 tsc、严格遵循 tsconfig.json、并避开输入输出路径的任何重叠。漏掉其中任意一环,都会表现为“保存没反应”或“报错但不提示”。











