如何使用 Typescript 在 Material UI 中扩展调色板

Posted

技术标签:

【中文标题】如何使用 Typescript 在 Material UI 中扩展调色板【英文标题】:How can I extend Color Palette in Material UI with Typescript 【发布时间】:2020-07-20 16:40:54 【问题描述】:

我是 react 和 typescript 的新手。 我正在尝试在全局主题上扩展调色板。

在我的 themeContainer.tsx 中

import  ThemeOptions  from '@material-ui/core/styles/createMuiTheme';

declare module '@material-ui/core/styles/createPalette' 
  // allow configuration using `createMuiTheme`
  interface Palette 
    accent: PaletteColor
  
  interface PaletteOptions 
    accent: PaletteColorOptions,
    tertiary: PaletteColorOptions
  
;

const ThemeContainer: React.FunctionComponent<Props> = (props, themeOptions: ThemeOptions) => 
  const  children  = props;

  const theme = useMemo(() => 
    const nextTheme = createMuiTheme(
      ...themeOptions,
      palette: 
        accent: 
          main: '#ff0000'
        ,
      
    );

    return nextTheme;
  );

  return <ThemeProvider theme=theme>children</ThemeProvider>;
;

export default ThemeContainer;


但是在我的组件上,出现了错误。

此调用没有过载。

提前谢谢你。

【问题讨论】:

【参考方案1】:

在 TS 中不是 100% 确定,但它对我来说是这样的:

declare module "@material-ui/core/styles/createPalette" 
  interface Palette     
    lightWarning: Palette["primary"];
  
  

  interface PaletteOptions     
    lightWarning: PaletteOptions["primary"];
   


在 projekt 主页找到简要介绍: https://material-ui.com/guides/typescript/#customization-of-theme

或者在这篇文章中: https://medium.com/javascript-in-plain-english/extend-material-ui-theme-in-typescript-a462e207131f

【讨论】:

【参考方案2】:

对于使用 MUI 5 的用户,您可以使用自定义类型覆盖 PalettePaletteOptions,然后使用现有类型扩展这些接口:

import 
  Palette as MuiPallete,
  PaletteOptions as MuiPaletteOptions,
 from '@mui/material/styles/createPalette';

declare module '@mui/material/styles/createPalette' 
  interface Palette extends MuiPallete 
    neutralShade: main: string;
  

  interface PaletteOptions extends MuiPaletteOptions 
    neutralShade?: main: string;
  

【讨论】:

【参考方案3】:

简短的回答是您不能(也不应该)这样做。

长答案包含以下解释:

Material UI 是 React 对 Material Design 概念的实现之一。

Material Design 是 Google 于 2014 年开发的一种设计语言。在 Google Now 首次亮相的“卡片”主题的基础上,Material Design 使用了更多基于网格的布局、响应式动画和过渡、填充和深度效果,例如灯光和阴影。

作为 Material Design 的一部分,您拥有 color system,其中包含一个主要/次要(以及它们每个的变体)。 您还可以控制深色/浅色主题,并且它们中的每一个都有原色/次要颜色。

如果您需要更多颜色 - 您可能不遵循 Material Design 的理念。

您始终可以使用 CSS/Variables/Styled 组件来获得额外的设计选项,但通常不应该这样做。

【讨论】:

我赞成这个,因为它是一个有效的论点。然而,AFAIK,Material Design 只是一个指导方针,而不是一个完整而严格的设计体系。我看到很多专业设计师根据自己的喜好对其进行修改。所以,这个问题也是有效的。 不完全正确。在 Material Design 中,您有特定数量的颜色,每种颜色都有特定的含义和用途。你不能真的只是添加新的颜色。如果你这样做了——你就没有保留 Material Design 系统的原始想法/结构。不过,我非常感谢您的支持 :-) 感谢@MaximMazurok! 作为开发人员,我同意你的看法。但根据我的经验,设计师往往对此事有自己的看法,他们将材料指南视为严格的规则。他们有时通过将材料卡与自定义元素和颜色混合使用“一切都是混合”的创意方法。因此,如果 OP 的工作是开发一个更改了材料设计的网站 - 那么他的案例是有效的。尽管它不是“纯粹的”材料设计,但有时开发人员必须做开发人员必须做的事情;D 不确定是否赞成或反对(所以我不会)。你是对的,你通常可以只切换原色或次要颜色,但是 MUI 实际上有关于扩展主题的文档,所以它显然不会被皱眉。 mui.com/customization/theming 。在某些情况下,如果用户可以自定义他们的 UI,或者开发人员需要在样式之间快速切换以向客户端显示备选方案,则用户可能需要许多主题。

以上是关于如何使用 Typescript 在 Material UI 中扩展调色板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中使用 RequestPromise?

如何在 Typescript 2.1+ 中使用 Bluebird

如何在Vue项目中使用Typescript

如何在 Typescript 中使用 Sinon?

如何在 React.js Typescript 版本中使用不支持 typescript 的 javascript 包

如何在 TypeScript 中使用 three.js 加载 OBJ 模型