必须补上 declare module 声明,否则 TypeScript 编译阶段报 TS2307;需精确匹配后缀(如 *.module.css),配合 tsconfig include 路径,并用工具生成 .d.ts 文件实现类名提示。

必须补上 declare module 声明,否则 TypeScript 在编译阶段就报 TS2307,根本走不到构建工具处理 CSS 的环节。
为什么 import './Button.module.css' 会报 TS2307
TypeScript 默认只识别 .ts/.js 模块,遇到 .module.css 这类扩展名,既不解析内容,也不推断导出结构。它不是“没加载样式”,而是“压根不认识这个模块类型”。常见错误信息包括:
Cannot find module './Button.module.css'Module has no exported member 'primary'- IDE 中
styles.后无补全,右键无法跳转
这些都不是 Webpack 或 Vite 配置失效,而是 TypeScript 类型系统在编译期就“失明”了。
声明文件必须严格匹配后缀和路径
不能写 declare module '*.css' —— 这会污染全局 CSS 导入(比如 import 'normalize.css'),导致副作用导入被误判为有默认导出。
立即学习“前端免费学习笔记(深入)”;
只声明你实际使用的模块后缀,例如:
declare module '*.module.css' {
const classes: { [key: string]: string };
export default classes;
}
declare module '*.module.scss' {
const classes: { [key: string]: string };
export default classes;
}
关键点:
- 文件路径需被
tsconfig.json的include覆盖,例如:"include": ["src/**/*", "types/**/*"] - 推荐放在
types/css-modules.d.ts,避免和业务代码混在一起 - 不要加
export =、const以外的修饰符,也不要给classes赋初始值 - 若项目还用
.module.less,照格式补一条对应声明
想获得类名自动提示?光靠 declare module 不够
上面的声明能让 import styles from './Button.module.css' 过编译,但 styles.primary 仍是任意字符串——TypeScript 不知道 primary 是否真实存在。
要实现 IDE 补全、拼写校验、跳转定义,得生成具体 .d.ts 文件:
- 用
npx tcm src/**/*.module.css --watch自动生成每个 CSS Module 对应的类型文件(如Button.module.css.d.ts) - 生成内容类似:
export const primary: string; export const disabled: string; - Vite 用户可配
vite-plugin-cssmodules实现自动产出 - Webpack 用户需在
css-loader中启用exportLocalsConvention: 'camelCaseOnly'并配合自定义 loader
注意:生成的 .d.ts 文件必须和源 CSS 文件同名、同目录,且不能被 exclude 掉。
最易被忽略的一点:声明文件写对了,但 tsconfig.json 没把它 include 进来,或文件后缀和 declare module 中写的不一致(比如写了 *.module.css 却导入 .module.scss),TS 就完全无视它——这种“静默失效”比报错更难排查。


















