tsconfig.json 中 compilerOptions 的 strict、skipLibCheck、moduleResolution 等选项直接影响 VSCode 类型检查和补全,而 include/exclude 仅控制编译不作用于编辑器;需手动选择项目 TypeScript 版本并验证悬停提示、模块导入等行为。
tsconfig.json 不是“配了就能用”,关键在 compileroptions 里哪些选项必须开、哪些不能乱动,否则 vscode 的类型检查和编译行为会不一致。
为什么改了 tsconfig.json 但 VSCode 还是报错或不提示?
VSCode 默认使用项目根目录下的 tsconfig.json 启动 TypeScript 语言服务,但它只读取 compilerOptions,忽略 include/exclude 等影响编译输出的配置。常见表现:
- 修改了
target为"ES2020",但编辑器仍允许使用Array.prototype.at()(该方法在 TS 4.6+ 才被识别)——说明你用的不是项目本地 TS 版本 - 加了
"noImplicitAny": true,但已有文件没报错——可能该文件没被include或不在当前打开的 TS 语言服务作用域内 - VSCode 左下角显示 “TypeScript 5.0.4” 但
node_modules/typescript是 4.9.5 ——它用了内置 TS,不是项目依赖的版本
解决办法:在 VSCode 设置中启用 "typescript.preferences.includePackageJsonAutoImports": "auto",并在命令面板运行 Typescript: Select TypeScript Version,手动选项目里的 node_modules/typescript。
compilerOptions 中真正影响 VSCode 编辑体验的几项
以下选项直接控制类型检查强度、自动补全行为和错误红线位置,其他如 outDir、declaration 对编辑器无感:
-
"strict": true—— 必开。它是一组严格检查的开关总控(含noImplicitAny、strictNullChecks等),单独开子项容易漏掉关键约束 -
"skipLibCheck": true—— 建议开。跳过node_modules/@types的类型检查,大幅提升 VSCode 响应速度,不影响你代码的类型安全 -
"moduleResolution": "node"—— 必须匹配你的运行时(如 Node.js)。若用 ESM(type: "module"在package.json),还要加"module": "nodenext",否则 import 路径解析异常 -
"baseUrl"和"paths"—— 配合jsconfig.json或tsconfig.json使用别名时必需,否则 VSCode 无法跳转或补全@/utils这类路径
常见的 tsconfig.json 错误配置组合
这些组合会导致 VSCode 类型检查失效或行为矛盾:
-
"target": "ES5"+"lib": ["ES2015"]——lib指定的是可用的全局 API 类型,不是运行时能力;但 VSCode 会据此决定是否允许Promise、Map等语法,与target不一致就容易误报 -
"module": "commonjs"+"moduleResolution": "bundler"—— 后者是 Webpack/Rollup 等打包器专用解析策略,VSCode 不支持,会导致路径跳转失败 - 根目录有
tsconfig.json,子目录又建一个带"extends"的——VSCode 只认当前打开文件所在目录最近的tsconfig.json,不会自动向上合并,extends在编辑器里基本无效
示例最小可靠配置:
{
"compilerOptions": {
"target": "ES2020",
"lib": ["ES2020", "DOM"],
"module": "commonjs",
"skipLibCheck": true,
"strict": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx"
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
VSCode 里怎么验证 tsconfig.json 生效了?
不要只看有没有报错,要主动验证关键行为:
- 在
src/index.ts里写const a = [];,把鼠标悬停在a上,看提示是否为any[](没开strict)还是never[](开了strict且启用了类型推导) - 新建
src/test.d.ts,写declare module 'xxx';,然后在另一个文件中import 'xxx'—— 如果没报错且能跳转,说明include和模块解析正常 - 删掉
node_modules/typescript,再打开 VSCode:如果左下角显示 “TypeScript 5.x.x (Workspace)”,说明它正在用你项目里的版本;如果变成 “TypeScript 5.x.x (Bundled)”,说明配置没生效或路径不对
最常被忽略的一点:tsconfig.json 的 include 和 files 只控制编译范围,**不影响 VSCode 的类型服务作用域**——只要文件是 .ts/.tsx 后缀、且在工作区中打开,就会被语言服务加载,哪怕它不在 include 列表里。










