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

MUI5(TypeScript)中向makeStyle传递Props的正确实现方式

MUI4 迁移至 MUI5 解决 TypeScript 类型约束错误

问题场景

将MUI4的makeStyles代码迁移到MUI5时,使用tss-react/mui的makeStyles出现类型错误:

Type 'Props' does not satisfy the constraint 'string'.ts(2344)

原MUI4代码

import { createStyles, makeStyles } from '@material-ui/core';
import { Theme } from '@material-ui/core/styles/createMuiTheme';

type Props = {
  darkMode?: boolean;
};

const useStyles = makeStyles<Theme, Props>((theme: Theme) =>
  createStyles({
    button: (props: Props) => ({
      color: props.darkMode ? '#fff' : '#AE4',
    }),
  }),
);

export default useStyles;

迁移后报错的MUI5代码

import { makeStyles } from 'tss-react/mui'
import { Theme } from '@mui/material/styles'

type Props = {
  darkMode?: boolean;
};


const useStyles = makeStyles<Theme, Props>((theme: Theme) => ({
  return {
    button: (props: Props) => ({
      color: props.darkMode ? '#fff' : '#AE4',
    }),
  }
})

错误原因

tss-react的makeStyles泛型参数顺序和MUI4完全相反:MUI4是<Theme, Props>,而tss-react中第一个泛型是组件props类型,第二个才是主题类型(可选,默认匹配MUI的Theme)。同时,回调函数的写法有误,不需要额外嵌套return对象。

正确实现方式

import { makeStyles } from 'tss-react/mui';
import { Theme } from '@mui/material/styles';

type Props = {
  darkMode?: boolean;
};

// 调整泛型顺序为 <Props, Theme>,回调直接返回样式对象
const useStyles = makeStyles<Props, Theme>()((theme, props) => ({
  button: {
    color: props.darkMode ? '#fff' : '#AE4',
  },
}));

export default useStyles;

或者更简洁的写法(Theme可省略,默认自动推导):

import { makeStyles } from 'tss-react/mui';

type Props = {
  darkMode?: boolean;
};

const useStyles = makeStyles<Props>()((theme, props) => ({
  button: {
    color: props.darkMode ? '#fff' : '#AE4',
  },
}));

export default useStyles;

补充说明

  • tss-react的makeStyles回调会直接传入theme和props两个参数,无需在单个样式属性中单独接收props
  • 泛型参数顺序变更为[Props, Theme],其中Theme是可选参数,使用默认MUI主题时可省略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:39:36