应修改 tsconfig.json 的 "lib" 和 "types" 配置以精准控制全局补全:移除无关库(如 "dom")、清空 "types" 数组,并重启 ts 服务生效。

为什么 globalThis 和 window 的属性总在补全里刷屏?
VSCode 默认把全局对象所有可枚举属性(比如 localStorage、fetch、atob)都纳入 JavaScript/TypeScript 补全候选,尤其在非浏览器环境(如 Node.js、ESM 工具脚本)里,这些补全不仅无用,还会掩盖真正需要的变量名。
这不是类型定义问题,而是语言服务对全局作用域的“过度暴露”。关键点在于:VSCode 本身不控制哪些全局变量该出现,它依赖 TypeScript 的 lib 配置和当前文件的 /// <reference lib="..."></reference> 声明。
- 检查你项目根目录是否有
tsconfig.json,重点看"lib"字段 —— 如果包含"dom",即使你在写纯 Node 脚本,window、document等也会进补全 - 单个 JS 文件顶部若有
/// <reference lib="dom"></reference>,效果等同于全局启用 DOM 库 - TypeScript 5.0+ 开始,
lib默认值会根据module和target自动推导,但 VSCode 往往缓存旧配置,重启 TS 服务才能生效
如何精准屏蔽特定全局变量(比如 console 或 process)?
VSCode 没有“黑名单式”过滤全局补全的开关,但你可以通过覆盖全局声明来“删除”它们。原理是:TS 类型合并机制中,后续声明若将某属性设为 never 或使用 declare global 重定义,可让其从补全中消失。
在项目中新建一个 types/global-override.d.ts(确保被 tsconfig.json 的 "include" 覆盖),写入:
declare global {
interface Window {
console: never;
localStorage: never;
sessionStorage: never;
}
// Node 环境下想隐藏 process?
// interface NodeJS.Global {
// process: never;
// }
}
⚠️ 注意:never 只影响补全和类型检查,不阻止运行时访问;如果代码真用了被屏蔽的变量,TS 会报错,这时就得权衡是留着补全还是接受类型安全。
javascript.suggest.autoImports 和全局补全有什么关系?
这个设置控制的是「自动导入未声明模块」,和全局变量补全无关。很多人误关它以为能减少干扰,其实只是让 useState 这类来自 React 的符号不再自动加 import,但 setTimeout 这种全局函数照常出现在补全列表里。
真正影响全局补全密度的是以下两个设置:
-
editor.suggest.showKeywords:关掉它,能隐藏if、return等关键字(但通常没必要) -
typescript.preferences.includePackageJsonAutoImports:设为"off",避免补全里混入package.json字段名(如name、version) - 最有效的其实是改
tsconfig.json的"types"—— 删除["node", "jest"]等你不当前需要的类型包,它们带来的全局声明会直接进补全
JS 文件没 tsconfig.json 怎么办?
纯 JS 项目依赖 JSDoc + TS 内置库推断,此时全局补全来源更难控制。可行办法只有两个:
- 在文件顶部加 JSDoc 注释明确排除环境:
/** @type {import('node').Global & typeof globalThis} */不行,但反过来写/** @type {Omit<typeof globalthis>} */</typeof>也没用 —— JSDoc 不支持这种动态剔除 - 务实做法:创建最小
jsconfig.json,内容为:{ "compilerOptions": { "lib": ["es2020"], "types": [] } }这样就只保留 ES 标准全局,彻底去掉 DOM、Node 等扩展 - VSCode 1.86+ 支持
"javascript.inlayHints.variableTypes.enabled": false,虽然不解决补全,但能减少内联提示对视线的干扰
补全过滤本质是类型系统边界问题,不是编辑器功能开关。最稳的解法永远是让 TS 知道“你不需要什么”,而不是让 VSCode “别显示什么”。lib 和 types 配置一旦写错,重启 VSCode 或手动触发 Developer: Restart TS Server 才能看到效果。











