eslint-plugin-unused-imports 检不出未使用的导出函数,因其仅分析 import/export 语法层面关系,无法追踪 export 函数是否被其他文件实际 import;动态加载、测试引用、字符串调用等场景天然逃逸静态分析,需依赖 ts-unused-exports 等项目级扫描工具结合全局搜索、类型校验与运行时验证交叉确认。

为什么 eslint-plugin-unused-imports 检不出未使用的导出函数?
因为 ESLint 默认只分析导入/引用关系,不追踪模块级 export 的实际消费方——尤其当函数被动态导入、测试文件引用、或通过字符串调用(如 require('./utils')[funcName])时,静态分析天然漏报。eslint-plugin-unused-imports 主要针对 import 和 export { x } 语法,对 export function foo() 或 export default 的使用检测非常弱。
真正能覆盖“导出但未被任何地方 import”的场景,得靠构建时或项目级扫描工具,而非纯语法检查插件。
用 ts-unused-exports 扫描 TypeScript 项目中的未使用导出
这是目前最接近需求的 CLI 工具,专为 TS 项目设计,能识别所有 export 声明并反向查证是否被其他文件 import。它不依赖 ESLint,直接读取 tsconfig.json 和 AST。
- 安装:
npm install --save-dev ts-unused-exports - 运行:
npx ts-unused-exports ./tsconfig.json(确保tsconfig.json中"include"覆盖全部源码目录) - 注意:它默认忽略
test、__tests__、.spec.ts等测试文件,如需包含测试引用,加--include-tests参数 - 输出结果是绝对路径 + 行号,例如:
/src/utils.ts:12:10—— 对应第 12 行导出的函数名
VSCode 插件层面的实时提示局限在哪?
VSCode 本身没有原生“未使用导出”高亮功能;所谓“检测”,实际是依赖语言服务器(如 TypeScript Server)或第三方插件(如 ES7+ React/Redux/React-Native snippets 类扩展)的副产物,可靠性极低。
常见误判场景:
- 导出函数被 Webpack 的
import(/* webpackMode: "eager" */ './mod')动态加载 → TS Server 认为未引用 - 导出被 JSDoc
@see或注释中提及 → 插件误判为“已使用” - 导出类型(
export type)和值(export function)混在同一文件 → 多数插件把类型导出也当“函数”报错 - 项目用了
isolatedModules: true,但ts-unused-exports不支持该模式,会报错退出
手动验证某个 export 是否真没人用
别全信工具输出。最稳妥的方式是全局文本搜索 + 类型安全校验:
- 在 VSCode 中对函数名右键 →
Find All References(快捷键Shift+F12),看是否返回空结果;注意勾选 “Include indirect references” - 临时注释掉该
export行,运行tsc --noEmit,观察是否报Cannot find module或Module has no exported member错误 - 如果项目有单元测试,运行
npm test -- --grep="functionName"确认没测试依赖它 - 检查打包产物(如
dist/)里该函数是否出现在最终 bundle 中(用grep -r "functionName" dist/)——若出现,说明至少有一个动态引用逃过了静态分析
导出函数的“未使用”判断,本质是跨文件、跨工具链、甚至跨构建阶段的推理问题。工具只能给出线索,最终得靠人眼交叉验证。尤其在 monorepo 或有 code-splitting 的项目里,一个 export 可能在另一个 package 里被引用,而扫描工具根本没看到那个 package 的源码。











