Typescript is always complaining about certain properties missing in the palette. My app works just fine if I add //@ts-ignore
, but I obviously want to avoid that. I'm new to Typescript and here is what I've tried.
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);
This throws an error,
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
This is a confusing error for me, because type I'm not using the type Palette
anywhere.
How can I properly extend the palette here?
This can be solved much easier via Module Augmentation:
MUI v5
material-ui.d.ts
import { PaletteOptions } from "@mui/material/styles/createPalette";
declare module "@mui/material/styles/createPalette" {
export interface PaletteOptions {
chip: {
color: string;
expandIcon: {
background: string;
color: string;
};
};
}
}
MUI v4
material-ui.d.ts
import { PaletteOptions } from "@material-ui/core/styles/createPalette";
declare module "@material-ui/core/styles/createPalette" {
export interface PaletteOptions {
chip: {
color: string;
expandIcon: {
background: string;
color: string;
};
};
}
}
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
}
}));
If we look at the 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;
We would find that Theme
and ThemeOptions
play a different role.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With