tsc文件大小写报错

tsc 编译器缓存导致文件大小写报错的排查与解决

#resource / typescript #type / howto #status / evergreen

[!info] related notes

tsc文件大小写报错

目标

解决 TypeScript 编译时因文件名大小写不一致导致的报错(如 Cannot find module './Utils' 但文件实际为 utils.ts)。

前置条件

  • TypeScript 项目
  • Windows 或 macOS(文件系统默认不区分大小写)
  • Linux 上不常见此问题(ext4 默认区分大小写)

现象

tsc 报错类似:

error TS2307: Cannot find module './components/UserList' or its corresponding type declarations.

但文件实际存在于 ./components/userList.ts(小写 u)。

原因

  1. 操作系统不区分大小写:Windows (NTFS) 和 macOS (APFS) 默认文件名不区分大小写,import './Utils' 能正常找到 utils.ts
  2. Git 跟踪大小写变更:Git 默认配置 core.ignorecase=true,重命名大小写后 Git 可能保留旧的索引
  3. tsc 增量编译缓存:TypeScript 的 .tsbuildinfo 缓存中记录了旧的大小写路径

步骤

1. 清除编译缓存

# Windows PowerShell
cd packages/domain-server
Remove-Item -Recurse -Force node_modules -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force dist -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force *.tsbuildinfo -ErrorAction SilentlyContinue
npm install
# macOS / Linux
cd packages/domain-server
rm -rf node_modules dist *.tsbuildinfo
npm install

2. 统一 import 路径大小写

# 查找可能有问题的 import
grep -rn "from './" --include="*.ts" --include="*.tsx" src/

确保 import 路径与实际文件名大小写完全一致。

3. 配置 tsconfig.json 严格检查

{
  "compilerOptions": {
    "forceConsistentCasingInFileNames": true
  }
}

此选项会让 tsc 在大小写不匹配时直接报错,而不是依赖操作系统行为。

4. Git 配置

# 让 Git 区分大小写(推荐)
git config core.ignorecase false

# 如果已有大小写问题的文件,强制重命名
git mv src/components/UserList.ts src/components/userList.ts

验证

  1. 开启 forceConsistentCasingInFileNames 后重新编译,确认大小写不匹配的 import 会报错
  2. 在 CI 环境(通常是 Linux)跑一次构建,确认不因大小写问题失败
创建于 2025/1/1 更新于 2026/5/27