MUI v5 - 在 TypeScript 中扩展 Typography 变体会产生错误 "No overload matches this call"
MUI v5 - Extending Typography variant in TypeScript creates error "No overload matches this call"
我正在为使用 MUI v5 和 TypeScript 的应用程序设置基础。我想用一些添加到现有默认属性的自定义属性来扩展 MUI 主题。
我的 theme.ts 配置如下所示:
import { createTheme, ThemeOptions } from "@mui/material/styles";
interface IThemeOptions extends ThemeOptions {}
export const themeStyles = {
palette: {...},
breakpoints: {...},
typography: {
h1: {...},
h2: {...},
h3: {...},
h4: {...},
h5: {...}
h6: {...},
button: {...},
body1: {...},
body2: {...},
//this is the custom prop I want to add
h1Bold: {
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
fontWeight: 700,
fontSize: "3.3125rem",
lineHeight: "1.15em",
color: "#1D1D1D",
marginTop: "20px",
marginBottom: "10px",
},
},
};
const theme = createTheme(themeStyles as IThemeOptions);
export default theme;
我这样称呼 App.tsx 中的“h1Bold”属性:
import React from "react";
// Mui
import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography";
interface IProps {}
const App: React.FC = (): JSX.Element => {
return (
<Box
className="App"
component="div"
sx={{
backgroundColor: "white",
}}
>
<Typography variant="h1Bold">
I am the App
</Typography>
</Box>
);
};
export default App;
这给了我错误:
No overload matches this call.
"Overload 1 of 2, '(props: { component: ElementType<any>; } & SystemProps<Theme> & { align?: "right" | "left" | "inherit" | "center" | "justify" | undefined; children?: ReactNode; ... 6 more ...; variantMapping?: Partial<...> | undefined; } & CommonProps & Omit<...>): Element', gave the following error.
Type '"h1Bold"' is not assignable to type '"button" | "caption" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "inherit" | "subtitle1" | "subtitle2" | "body1" | "body2" | "overline" | undefined'.
Overload 2 of 2, '(props: DefaultComponentProps<TypographyTypeMap<{}, "span">>): Element', gave the following error.
Type '"h1Bold"' is not assignable to type '"button" | "caption" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "inherit" | "subtitle1" | "subtitle2" | "body1" | "body2" | "overline" | undefined'."
所以我理解这个错误,我必须以某种方式更新定义。我该怎么做才能让 TypeScript 理解新添加的“h1Bold”属性?
我的 index.ts 看起来像这样:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
import { Provider } from "react-redux";
import store from "./redux/store";
import { persistStore } from "redux-persist";
import { PersistGate } from "redux-persist/integration/react";
import { ThemeProvider } from "@mui/material/styles";
//this is the theme created with createTheme()
import theme from "./config/theme/theme";
import App from "./App";
import "./index.css";
// Redux-Persist
let persistor = persistStore(store);
ReactDOM.render(
<React.StrictMode>
<ThemeProvider theme={theme}>
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<BrowserRouter>
<App />
</BrowserRouter>
</PersistGate>
</Provider>
</ThemeProvider>
</React.StrictMode>,
document.getElementById("root")
);
如果有人能给我一些见解或有解决方案如何通过使用 TypeScript 更轻松地扩展和读取 MUI 主题,那就太好了。
干杯
要更新 Typescript 中的 Typography
变体,请使用以下代码:
declare module '@mui/material/Typography' {
interface TypographyPropsVariantOverrides {
h1Bold: true;
}
}
以上接口的属性就是merged with现有的变体。现在 Typography
的 variant
是:
"h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "subtitle1" | "subtitle2" | "body1" | "body2" | "caption" | "button" | "overline" | "inherit" | "h1Bold"
您现在可以使用新变体而不会被 Typescript 投诉:
<Typography variant='h1Bold'
现场演示
在 MUI v5 中,根据 MUI docs.
,您需要在 TypeScript 中声明几个额外的属性
declare module "@mui/material/styles" {
interface TypographyVariants {
h1Bold: React.CSSProperties;
}
// allow configuration using `createTheme`
interface TypographyVariantsOptions {
h1Bold?: React.CSSProperties;
}
}
// Update the Typography's variant prop options
declare module "@mui/material/Typography" {
interface TypographyPropsVariantOverrides {
h1Bold: true;
}
}
我正在为使用 MUI v5 和 TypeScript 的应用程序设置基础。我想用一些添加到现有默认属性的自定义属性来扩展 MUI 主题。
我的 theme.ts 配置如下所示:
import { createTheme, ThemeOptions } from "@mui/material/styles";
interface IThemeOptions extends ThemeOptions {}
export const themeStyles = {
palette: {...},
breakpoints: {...},
typography: {
h1: {...},
h2: {...},
h3: {...},
h4: {...},
h5: {...}
h6: {...},
button: {...},
body1: {...},
body2: {...},
//this is the custom prop I want to add
h1Bold: {
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
fontWeight: 700,
fontSize: "3.3125rem",
lineHeight: "1.15em",
color: "#1D1D1D",
marginTop: "20px",
marginBottom: "10px",
},
},
};
const theme = createTheme(themeStyles as IThemeOptions);
export default theme;
我这样称呼 App.tsx 中的“h1Bold”属性:
import React from "react";
// Mui
import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography";
interface IProps {}
const App: React.FC = (): JSX.Element => {
return (
<Box
className="App"
component="div"
sx={{
backgroundColor: "white",
}}
>
<Typography variant="h1Bold">
I am the App
</Typography>
</Box>
);
};
export default App;
这给了我错误:
No overload matches this call.
"Overload 1 of 2, '(props: { component: ElementType<any>; } & SystemProps<Theme> & { align?: "right" | "left" | "inherit" | "center" | "justify" | undefined; children?: ReactNode; ... 6 more ...; variantMapping?: Partial<...> | undefined; } & CommonProps & Omit<...>): Element', gave the following error.
Type '"h1Bold"' is not assignable to type '"button" | "caption" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "inherit" | "subtitle1" | "subtitle2" | "body1" | "body2" | "overline" | undefined'.
Overload 2 of 2, '(props: DefaultComponentProps<TypographyTypeMap<{}, "span">>): Element', gave the following error.
Type '"h1Bold"' is not assignable to type '"button" | "caption" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "inherit" | "subtitle1" | "subtitle2" | "body1" | "body2" | "overline" | undefined'."
所以我理解这个错误,我必须以某种方式更新定义。我该怎么做才能让 TypeScript 理解新添加的“h1Bold”属性?
我的 index.ts 看起来像这样:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
import { Provider } from "react-redux";
import store from "./redux/store";
import { persistStore } from "redux-persist";
import { PersistGate } from "redux-persist/integration/react";
import { ThemeProvider } from "@mui/material/styles";
//this is the theme created with createTheme()
import theme from "./config/theme/theme";
import App from "./App";
import "./index.css";
// Redux-Persist
let persistor = persistStore(store);
ReactDOM.render(
<React.StrictMode>
<ThemeProvider theme={theme}>
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<BrowserRouter>
<App />
</BrowserRouter>
</PersistGate>
</Provider>
</ThemeProvider>
</React.StrictMode>,
document.getElementById("root")
);
如果有人能给我一些见解或有解决方案如何通过使用 TypeScript 更轻松地扩展和读取 MUI 主题,那就太好了。
干杯
要更新 Typescript 中的 Typography
变体,请使用以下代码:
declare module '@mui/material/Typography' {
interface TypographyPropsVariantOverrides {
h1Bold: true;
}
}
以上接口的属性就是merged with现有的变体。现在 Typography
的 variant
是:
"h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "subtitle1" | "subtitle2" | "body1" | "body2" | "caption" | "button" | "overline" | "inherit" | "h1Bold"
您现在可以使用新变体而不会被 Typescript 投诉:
<Typography variant='h1Bold'
现场演示
在 MUI v5 中,根据 MUI docs.
,您需要在 TypeScript 中声明几个额外的属性declare module "@mui/material/styles" {
interface TypographyVariants {
h1Bold: React.CSSProperties;
}
// allow configuration using `createTheme`
interface TypographyVariantsOptions {
h1Bold?: React.CSSProperties;
}
}
// Update the Typography's variant prop options
declare module "@mui/material/Typography" {
interface TypographyPropsVariantOverrides {
h1Bold: true;
}
}