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

如何修复MUI V5中ownerState.color的TypeScript错误

修复MUI V5按钮悬停颜色的TypeScript类型问题

要修改所有按钮的悬停颜色并解决ownerState的类型问题,可按以下方案操作:

方法一:全局主题配置(修改所有按钮)

通过createTheme扩展MUI组件样式,利用ownerState判断按钮变体/状态来设置悬停样式:

import { createTheme, ThemeProvider } from '@mui/material/styles';

const theme = createTheme({
  components: {
    MuiButton: {
      styleOverrides: {
        root: ({ ownerState }) => ({
          '&:hover': {
            // 基础浅色悬停背景
            backgroundColor: '#f5f5f5',
            // 针对不同变体做差异化处理
            ...(ownerState.variant === 'contained' && {
              backgroundColor: '#e0e0e0'
            }),
            ...(ownerState.variant === 'outlined' && {
              backgroundColor: '#fafafa',
              borderColor: '#bdbdbd'
            })
          }
        })
      }
    }
  }
});

// 在根组件中包裹ThemeProvider
function App() {
  return <ThemeProvider theme={theme}>{/* 你的应用内容 */}</ThemeProvider>;
}

方法二:自定义Styled按钮

如果需要局部按钮生效,用styled组件创建自定义按钮,同时处理类型:

import { Button, styled } from '@mui/material';

// 基于MUI Button扩展,自动继承类型
const LightHoverButton = styled(Button)(({ theme, ownerState }) => ({
  '&:hover': {
    backgroundColor: theme.palette.grey[100],
    // 根据按钮颜色属性调整
    ...(ownerState.color === 'primary' && {
      backgroundColor: theme.palette.primary.light
    })
  }
}));

// 使用示例
<LightHoverButton variant="contained">测试按钮</LightHoverButton>

解决TypeScript类型报错

如果遇到ownerState属性不存在的类型提示,可扩展MUI的Button类型声明:

import { ButtonOwnerState } from '@mui/material/Button';

// 扩展Button的OwnerState类型(添加自定义属性时用)
declare module '@mui/material/Button' {
  interface ButtonOwnerState {
    // 这里添加你的自定义属性,比如isLightHover?: boolean;
  }
}

扩展后,TS会自动识别新增的ownerState属性,避免类型报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:08