vscode 本身不提供“一键删除未使用变量”功能,真正识别并删除的是 typescript 编译器或 eslint;shift+f12 查引用而非使用状态,未使用变量无引用故不可查;typescript 的 nounusedlocals 规则最准,需在 tsconfig.json 中启用;eslint 的 no-unused-vars 需配合 @typescript-eslint 插件及正确配置才支持自动修复。

VSCode 本身不提供“一键删除未使用变量”的功能,它只负责展示诊断信息;真正能识别并删掉未使用变量的,是 TypeScript 编译器或 ESLint 这类静态分析工具。你看到的灰色、波浪线、报错,都是它们告诉 VSCode 的结果。
为什么 Shift+F12 找不到未使用变量
Shift+F12 是「查找所有引用」,它只对已声明且有定义的符号有效。如果你有个变量 foo 声明了但没被用过,它根本不会出现在引用列表里——因为压根没人引用它。这不是功能缺失,而是设计如此:这个快捷键解决的是「这个东西在哪被用了」,不是「这个东西有没有被用」。
- 对
import语句整行按 Shift+F12,查的是导出名(比如map)的引用,不是导入语句本身是否冗余 - 对未声明/拼错的变量按 F12,会提示「无法找到定义」,和「未使用」是两回事
- 灰色高亮 ≠ 可安全删除,有些变量可能被动态访问(如
obj[key])、eval 或运行时反射绕过检测
真正起作用的是 TypeScript 的 noUnusedLocals
在 TypeScript 项目中,noUnusedLocals 和 noUnusedParameters 是编译器原生支持的检查项,比 ESLint 更准、更早介入。只要你在 tsconfig.json 中开启它们,VSCode 就会实时标出未使用的局部变量和函数参数。
- 启用方式:把
"noUnusedLocals": true和"noUnusedParameters": true加入tsconfig.json的compilerOptions - 注意:它不检查模块顶层的
import,只管const/let/function等声明 - 误报常见于:解构赋值中带默认值的变量(如
const { a = 1, b } = obj,a会被标为未使用)、类型导入(import type不受此规则影响) - 关闭提示?别关规则,而是加
// @ts-ignore或改用as const等方式让类型系统理解意图
ESLint 的 no-unused-vars 要配对才生效
JS/TS 项目常用 ESLint 检查变量,但 no-unused-vars 默认行为很保守:它不检查函数参数、不检查解构中的属性、不检查类型导入,而且在纯 JS 文件里对 import 完全无感。
- 要让它管
import,必须用@typescript-eslint/no-unused-imports,且配置中必须同时指定:parser: "@typescript-eslint/parser"和plugins: ["@typescript-eslint"] - 规则设为
"error"或"warn"后,按Ctrl+Shift+P→ 输入ESLint: Fix all auto-fixable Problems,可批量删掉可自动修复的未使用变量和导入(前提是规则标记为fixable: true) - 常见失效原因:文件后缀是
.js但项目是 TS,ESLint 没加载 TS 解析器;或者文件没被eslint.config.js的files匹配到 - 别依赖「右键 → Quick Fix」弹窗——有些问题它根本不显示修复选项,得靠命令面板触发全量修复
别手写正则全局搜删变量
有人想用 Ctrl+Shift+F 搜 const xxx = 再手动删,这极其危险。变量名可能出现在字符串、注释、正则字面量、JSON 键里,也可能被重命名工具(如 TS 的 rename symbol)漏掉引用。
- 正则
\bconst\s+([a-zA-Z_$][\w$]*)\s*=会匹配const url = "https://xxx.com",但url明显在用 - 删除前务必确认该变量没被
eval、Function构造函数、Object.keys()、Proxy等动态方式访问 - 最稳妥路径:先让
tsc --noEmit或eslint .跑一遍,只处理它明确报错的条目,再人工验证上下文
复杂点在于:未使用 ≠ 可删除。动态访问、测试桩、未来预留、调试残留……这些都可能让一个“未被静态分析捕获使用”的变量实际承担职责。别迷信工具标灰就删,先看它是不是真没人碰。











