根本原因是tsserver未读取完整项目上下文,需确保tsconfig.json置于根目录、用include显式包含源码路径、正确配置baseUrl/paths,并在LSP中指定typescript-language-server路径;验证方式为故意写错配置看是否报错或查启动日志。

为什么大项目里跳转定义失效、类型提示空白
根本原因是 TypeScript 语言服务(tsserver)没读到完整项目上下文,不是插件没装好,而是 tsconfig.json 配置或路径没对上。常见现象:单文件补全正常,一进 src/utils 就卡住、Ctrl+Click 跳不到 src/models/User.ts、any 泛滥但没报错。
-
tsconfig.json必须放在项目根目录,且不能只写"files"—— 大项目要用"include"显式包含所有源码路径,例如"include": ["src/**/*", "types/**/*.d.ts"] - 如果用了路径别名(如
@/components),必须配"baseUrl"和"paths",且tsserver只认相对tsconfig.json的路径,别用~/或绝对路径 - LSP-typescript 插件默认只找
node_modules/typescript-language-server,但大项目往往用 pnpm/yarn,得在LSP.sublime-settings里手动指定"command"指向./node_modules/.bin/typescript-language-server
tsconfig.json 哪些选项直接影响类型推导精度
开 "strict" 不等于类型推导强——它只是开关,真正决定推导深度的是底层配置组合。比如 noImplicitAny 开了但 skipLibCheck: true,第三方库类型就全丢;resolveJsonModule: true 没开,import data from "./config.json" 就推不出结构。
-
"composite": true和"declarationMap": true对 monorepo 项目关键:让tsserver知道哪些.d.ts是可复用的,否则跨包引用时类型会退化成any -
"lib"别盲目写["es2022", "dom"]—— 如果项目跑在 Node.js 环境,加dom会导致全局变量污染(如document被误推导),应改用["es2022", "node18"] -
"moduleResolution": "nodenext"是 TS 5.0+ 推荐值,但 Sublime 的 LSP 客户端必须 ≥ v1.22 才能正确解析 ESM 导入,旧版会漏掉exports字段里的条件导出
Sublime 里怎么确认 tsserver 正在用你写的 tsconfig
别信状态栏显示的 “LSP: tsserver” —— 它可能连的是另一个项目的配置,或者降级到无配置模式。验证方法只有两个:看错误是否符合预期,和查 tsserver 启动日志。
- 在
tsconfig.json里故意写错一个选项,比如"target": "es2099",保存后如果状态栏弹出error TS6046: Invalid value for 'target',说明配置被读取了;没报错就是没生效 - 打开 Sublime 控制台(
Ctrl+`),输入view.window().run_command("lsp_show_panel"),再触发一次跳转操作,日志里会打印tsserver启动命令和当前工作目录 —— 检查--project参数指向的是否是你项目的tsconfig.json - 如果日志里出现
Starting TS Server但后面跟着Failed to load project,大概率是tsconfig.json语法错误,用npx tsc --noEmit --pretty在终端跑一遍验证
大项目编辑卡顿,其实是 tsserver 内存溢出
不是 Sublime 本身慢,而是 tsserver 进程吃光内存后频繁 GC,导致补全延迟 2–3 秒、保存后错误列表 10 秒才更新。这不是调低 Sublime 设置能解决的。
- 在
LSP.sublime-settings里加"env": {"TSSERVER_MAX_HEAP_SIZE": "4096"}(单位 MB),避免默认 2GB 不够用 - 禁用非必要检查:在
tsconfig.json里设"skipDefaultLib": true+ 单独引入"lib": ["es2022"],省掉 DOM 类型加载时间 - 对
node_modules目录做排除 ——LSP-typescript默认不扫描它,但如果项目里有types/目录放了大量声明文件,得在"exclude"里显式加上"types/**/*"
tsconfig.json、package.json 的 types 字段、LSP 的 command 路径这三处必须同步更新,漏一个,类型推导就断链。


















