本文介绍如何通过 git 的 `.gitignore` 机制配合显式例外列表,安全、可追踪地禁止 `.js`/`.jsx` 文件进入 typescript 项目,兼顾强制约束与必要例外,无需自定义 eslint 规则或复杂 pre-commit 脚本。
虽然 ESLint 和 @typescript-eslint 强大且灵活,但它们本质上是代码质量检查工具,并非文件系统级准入控制器——ESLint 不处理文件是否应被纳入版本控制,它只对已加载的文件执行规则校验。因此,试图用 ESLint “禁止 .js 文件进入代码库”在设计上存在根本性错位:ESLint 不感知未被配置匹配到的文件(例如未在 files 或 overrides 中包含 .js 的配置下,.js 文件压根不会被 lint),更无法阻止其被 git add 或提交。
✅ 推荐方案:Git 层面的渐进式管控(.gitignore + 白名单例外)
这是轻量、可靠、可审计且与语言无关的工程实践:
全局屏蔽所有 .js/.jsx 文件
在项目根目录的 .gitignore 中添加:
# Block all JS/JSX files by default *.js *.jsx !*.d.ts # Keep declaration files (if needed)
为确需保留的 JS/JSX 文件添加显式例外
在同一 .gitignore 中,按需逐行添加白名单(支持通配符和路径):
# Allow specific legacy or tooling files !src/utils/legacy-helpers.js !config/webpack.config.js !**/*.test.jsx # e.g., allow test files during migration
迁移过程可视化与目标管理
每次成功将一个 .js 文件转换为 .ts 后,立即从 .gitignore 的白名单中移除对应行。这样:
⚠️ 注意事项:
总结而言,用 .gitignore 实现“默认拒绝 + 显式许可”模型,既
符合 Git 的设计哲学,又为 TypeScript 迁移提供了清晰、可持续、可协作的治理路径——规则即文档,例外即任务,忽略即进度。