You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript环境中使用SCSS Module时出现.default属性的原因是什么?

问题原因
  • css-loader 4.0及以上版本默认开启了esModule: true配置项,会把CSS Module的导出转为ES模块格式,所有类名会被挂载到导出对象的default属性下,而非直接作为导出对象的属性。
  • 你当前的webpack配置仅开启了modules=true,没有修改esModule的默认值,就出现了需要通过styles.default.button访问类名的情况,和typed-scss-modules默认生成的CommonJS风格类型定义不匹配,最终导致类型生成异常。
解决方法

方案1:调整css-loader配置(更推荐,改造成本低)

修改Storybook的webpack配置里的css-loader参数,关闭esModule即可匹配typed-scss-modules的默认输出规则:

const path = require('path');

module.exports = {
  stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: ['@storybook/addon-links', '@storybook/addon-essentials'],
  webpackFinal: async (config) => {
    config.module.rules.push({
      test: /\.scss$/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            modules: {
              exportLocalsConvention: 'camelCase', // 可选配置,可自动把kebab-case类名转为驼峰格式,更适配TS调用
              mode: true
            },
            esModule: false // 关闭ES模块导出,使用CommonJS格式,类名直接挂载在导出对象根级
          }
        },
        'sass-loader'
      ],
      include: path.resolve(__dirname, '../'),
    });
    return config;
  },
};

修改后即可直接通过styles.button访问类名,和typed-scss-modules默认生成的类型定义完全匹配。

方案2:适配ES模块导出格式

如果需要保留esModule开启的状态,同步修改两处配置即可:

  1. 把scss文件的导入语法改为默认导入:
import styles from './Button.module.scss';
  1. 运行typed-scss-modules时添加--exportType default参数,生成默认导出的类型定义,示例命令:
npx typed-scss-modules src --exportType default

内容的提问来源于stack exchange,提问作者AdMer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:27:00