这不是bug,是设计使然:sublime text本身不调用tsc,lsp仅提供语法诊断与跳转,编译需手动触发构建、终端执行tsc或监听插件驱动;必须确保语法标识为source.ts、存在tsconfig.json,并通过npx tsc等外部命令显式编译。

保存 .ts 文件不生成 .js?这不是 bug,是设计使然
Sublime Text 本身从不调用 tsc,哪怕你装了 LSP-typescript、右下角显示 LSP: tsserver,那也只是在做语法诊断和跳转——跟编译完全无关。很多人误把波浪线报错当成“已编译”,结果去翻 dist/ 目录发现空空如也。
真正触发编译的只有三类动作:手动按 Ctrl+B(构建系统)、终端执行 tsc 或 tsc -w、插件监听文件变化并调用命令(如 LiveBuild)。LSP 插件不负责这事,它只管“看”,不管“编”。
- 确认当前文件语法标识为
source.ts(右下角点击语法名 → 选 TypeScript);否则构建系统不会匹配到该文件 - 删掉所有废弃插件,比如
TSCompleteMe或老版TypeScript-Sublime-Plugin,它们会劫持构建流程且失败时不报错 - 检查项目根目录是否存在
tsconfig.json:没有它,tsc会降级为默认配置,outDir、baseUrl等路径相关选项全部失效
tsc 构建系统怎么写才不踩坑
最简可用的构建系统长这样:
{
"cmd": ["tsc", "$file"],
"selector": "source.ts",
"file_regex": "^(.*?)[(:](\d+)[,:](\d+)[):]\s*(.*)$",
"working_dir": "${project_path:${folder}}",
"shell": true
}
但直接这么用容易出问题:
-
tsc命令找不到?不是环境变量问题,而是 Sublime 的PATH和终端不一致。改用npx tsc更可靠,前提是项目里有package.json和node_modules/typescript - 想保存即编译?加
-w参数,但注意:"cmd": ["npx", "tsc", "-w", "$file"]会导致Ctrl+B启动后卡住——因为-w是长进程,Sublime 默认等它退出。得配"quiet": true+"target": "exec"才能后台运行(见下条) - 全局
tsc版本和项目要求不兼容?优先用./node_modules/.bin/tsc路径,或确保package.json中devDependencies明确指定了 TS 版本
为什么 LSP 显示错误但 tsc 不报?两套规则不互通
tsserver(LSP 调用)和 tsc(命令行编译)读的是同一份 tsconfig.json,但行为可能不一致:
-
strict开关只影响tsc输出,LSP 默认启用更宽松的类型检查(除非你在tsconfig.json里显式设"strict": true) - 路径映射(
paths)必须配合baseUrl使用,且两者都要在tsconfig.json中声明;LSP 可能缓存旧配置,重启 Sublime 或手动触发LSP: Restart Servers才生效 - 如果 LSP 报错而
tsc不报,大概率是include/exclude规则没覆盖到当前文件——tsc默认只编译include列表里的文件,LSP 则对打开的所有.ts文件做诊断
自动编译别硬刚,用 npx tsc -w + 文件监听更稳
靠 Sublime 自带构建系统实现“保存即编译”容易卡死或漏触发。推荐组合方案:
- 终端里跑
npx tsc -w(项目根目录),它会监听所有受tsconfig.json管控的文件,输出稳定、增量快 - 用
LiveBuild插件监听.ts文件变更,触发npx tsc --noEmit --skipLibCheck做快速类型校验(不生成 JS,只报错),避免和-w冲突 - 如果非要集成进 Sublime,构建系统里写
"cmd": ["sh", "-c", "npx tsc --noEmit && echo '✅ type check done'"],比直接跑tsc -w更可控
最后提醒一句:tsserver_path 指向 ./node_modules/typescript/lib/tsserver.js 时,必须确保 node_modules 在项目根目录;跨多层子目录打开文件,LSP 可能找不到配置——这不是插件问题,是路径解析逻辑决定的。










