根本原因是语言服务器未过滤带@deprecated等标记的符号,vscode默认全量展示;唯一通用解决法是设置"editor.suggest.showdeprecated": false,且需手动写入settings.json。

为什么补全列表里总出现不想看到的项
根本原因不是 VSCode “太智能”,而是语言服务器(如 TypeScript Server、Pylance)把所有符号一股脑报上来,而 VSCode 默认不筛——哪怕带 @deprecated 标签、私有成员、未导出函数、未使用变量,只要语义分析能识别,就进补全列表。
常见干扰项包括:document.write(DOM API 已弃用)、Array.observe(早被移除)、_internalHelper(私有方法)、unusedConfig(声明但未引用的变量)。
- 类型定义没加
@deprecated注释(比如旧版@types/react)→ 补全里照常显示findDOMNode - Pylance 用的是
basic类型检查模式 → 不严格读取 JSDoc 中的弃用标记 - TS 内置
lib.dom.d.ts版本老旧 → 仍保留大量已废 DOM 方法
全局禁用弃用项:唯一真正生效的开关
"editor.suggest.showDeprecated": false 是唯一跨语言、立竿见影的过滤手段。设为 false 后,所有明确标注 @deprecated 的符号彻底不出现在补全列表中(不是灰色显示,是直接消失)。
这个配置必须写进 settings.json,GUI 设置界面找不到它:
{
"editor.suggest.showDeprecated": false
}
- 对 TypeScript/JavaScript、Python(Pylance)、CSS 等均有效
- 不影响跳转、悬停文档、错误提示,只管补全列表可见性
- 若仍看到弃用项,说明对应类型定义根本没写
@deprecated,得升级@types包或等语言服务器更新
按语言定制补全内容类型
补全列表默认混杂函数、方法、属性、关键字、片段等。你可以用 editor.suggest.showXXX 系列开关精细控制哪些该出现:
-
"editor.suggest.showMethods": false→ 关闭方法建议(适合只想要属性或常量的场景) -
"editor.suggest.showProperties": false→ 关闭属性建议(如对象字面量中频繁弹出 getter/setter) -
"editor.suggest.showKeywords": false→ 关闭语言关键字(if、return等),避免干扰变量名输入 -
"editor.suggest.showSnippets": false→ 关闭代码片段(Emmet、自定义 snippet),防止和真实 API 冲突
这些开关在 JavaScript/TypeScript 中尤其有用;Python 下需配合 python.analysis.autoImportCompletions 控制 import 补全是否介入。
别漏掉语言服务本身的过滤能力
VSCode 只是管道,真正决定“有哪些符号可补全”的是背后的语言服务器。光调 VSCode 设置不够,还得确认服务端是否启用过滤逻辑:
- TypeScript:确保
"typescript.preferences.includePackageJsonAutoImports": "auto",否则新包 API 可能不进索引 - Python + Pylance:必须设
"python.analysis.typeCheckingMode": "basic"或更高,"strict"模式才强制读取@deprecated - CSS:启用
"css.completion.triggerPropertyValueCompletion": true才能在background:后弹出值建议 - 禁用 Jedi:Jedi 不识别弃用标记,
"python.languageServer": "Pylance"必须显式指定
最易忽略的一点:补全内容是否干净,80% 取决于你装的 @types 或 stub 文件是否最新。右键点击一个废弃方法 → “转到类型定义”,看路径是不是指向过时的 @types/xxx —— 是的话,npm outdated 和 npm update 比调设置更管用。











