当前位置: 首页 > 面试题库 >

如何使用Typescript扩展Material-UI主题?

糜鸿风
2023-03-14
问题内容

Typescript总是抱怨调色板中缺少某些属性。如果添加//@ts- ignore,我的应用程序运行正常,但显然我想避免这种情况。我是Typescript的新手,这是我尝试过的。

import createMuiTheme, { ThemeOptions, Theme } from '@material-ui/core/styles/createMuiTheme';
import { PaletteOptions } from '@material-ui/core/styles/createPalette';

interface IPaletteOptions extends PaletteOptions {
    chip: {
      color: string,
      expandIcon: {
        background: string,
        color: string,
      },
    },
}
interface ITheme extends Theme {
  palette: IPaletteOptions,
}

const theme: ITheme = createMuiTheme({
  typography: {
    fontWeightMedium: 600,
    fontFamily: ['Open Sans', 'Arial', 'sans-serif'].join(','),
  },
  palette: {
    primary: {
      main: '#43C099',
    },
    secondary: {
      main: '#7AF3CA',
    },
    chip: {
      color: '#C2C3C6',
      expandIcon: {
        background: '#808183',
        color: '#FFFFFF',
      },
    },
  },
} as ThemeOptions);

这会引发错误,

Type 'Theme' is not assignable to type 'ITheme'.
  Types of property 'palette' are incompatible.
    Property 'chip' is missing in type 'Palette' but required in type 'IPaletteOptions

对我来说这是一个令人困惑的错误,因为类型I不在Palette任何地方使用该类型。

如何在此处适当扩展调色板?


问题答案:

import createMuiTheme, { Theme, ThemeOptions } from "@material-ui/core/styles/createMuiTheme";
import { Palette } from "@material-ui/core/styles/createPalette";

interface IPalette extends Palette {
  xxx: {}
}
interface ITheme extends Theme {
  palette: IPalette;
}
interface IThemeOptions extends ThemeOptions {
  palette: IPalette;
}

const theme = createMuiTheme({
  palette: {
    ...
    xxx: {}                                        // Type been checked
  }
} as IThemeOptions)                                // Use customized ThemeOptions type

const useStyles = makeStyles((theme: ITheme) => ({ // Use customized Theme type
  root: {
    color: theme.palette.xxx                       // Work with no type error
  }
}));

参考

如果我们看一下createMuiTheme.d.ts

import { Palette, PaletteOptions } from './createPalette';

export interface ThemeOptions {
  palette?: PaletteOptions;
  ...
}

export interface Theme {
  palette: Palette;
  ...
}

export default function createMuiTheme(options?: ThemeOptions, ...args: object[]): Theme;

我们会发现这一点,ThemeThemeOptions发挥不同的作用。

  • 主题:返回类型
  • ThemeOptions:参数类型


 类似资料:
  • 我想使用打字稿从材料-用户界面扩展按钮组件的道具,以便能够将额外的道具传递给它的孩子。 我尝试在中添加以下声明。/app/types/material_ui.d.ts: 这将引发错误“TS2693:'Button'仅引用一种类型,但在此处用作值。 我也试过声明: 这将引发错误“TS2323:无法重新声明导出的变量'按钮'”。 我的tsconfig.json是这样的: 最后是来自Menty-UI的原

  • 问题内容: 我正在尝试添加一个属性以使用Typescript从中间件表达请求对象。但是我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不使用括号符号。 我正在寻找一种解决方案,允许我编写与此类似的内容(如果可能): 问题答案: 您想要创建一个自定义定义,并在Typescript中使用一个称为声明合并的功能。这是常用的,例如在中。 创建一个文件,并确保将其包含在您的-部分中(如果有)。内容如下

  • 我试图创建一个树选择组件,就像一个从antd树选择使用材料UI。我有一个material-ui、TextField和TreeView组件,一个在另一个下面。最初,我希望树视图被折叠,用户应该能够手动展开它。但是当用户在文本字段中键入一些文本时,我希望具有类似文本的节点被展开。我有代码在树中搜索文本,并获得匹配节点的节点ID。有一个名为的道具,它允许我们设置需要展开的节点ID列表。请参见下面的代码。

  • 我想使用材料-UI Next文本字段道具链接,道具类型是。前一个版本的材料UI道具名称是,道具类型是链接。 以前的版本使用道具: 在先前版本的Material UI中使用,代码可以很好地显示错误状态。 Textfield材质界面下一步使用

  • 问题内容: 我正在尝试一些非常简单的方法:使用Material-UI主题为网站构建两个主题: 一个主题和一个主题,但效果不佳:该主题位于每个Material-UI react元素上,但是html文档上的root元素仍具有相同的默认白色背景。 当然,可以通过使用纯.css攻击身体来更改它: 但是我一直想用React动态地更改它,尽管这可以工作,但是不能: 而且我在这里迷路了,有没有办法用Materi

  • 如果发现 Cocos Creator 内置的界面元素仍然满足不了你的需求,也不必太担心,你可以通过自定义元素 来对 UI Kit 进行扩展。 UI Kit 的扩展是基于 HTML5 的 Custom Elements 标准。 通过 Editor.UI.registerElement(tagName, prototype) 我们可以很轻松的注册自定义元素。这里 有一个简单的范例。 Editor.UI