I have some different styled component with some common styles, so I've created a function that takes in theme and returns the common styles.
It looks something like this:
const getCommonStyled = (theme: Theme) => ({
height: '100%',
display: 'flex',
flexDirection: 'column',
padding: theme.spacing(2),
})
const StyledComponent1 = styled('div')(({ theme }) => ({
...getCommonStyled(theme),
color: 'blue'
}))
const StyledComponent2 = styled(Typography)(({ theme }) => ({
...getCommonStyled(theme),
backgroundColor: 'blue'
}))
const StyledComponent3 = styled('span')(({ theme }) => ({
...getCommonStyled(theme),
width: 100,
height: 100,
}))
This seems simple enough, but Typescript will not allow it and its error message is confusing:
error TS2769: No overload matches this call. The last overload gave the following error. Argument of type '({ theme }: MUIStyledCommonProps & ClassAttributes & HTMLAttributes & { ...; }) => { ...; }' is not assignable to parameter of type 'TemplateStringsArray'.
How can I type getCommonStyled so that these errors go away?
When you don't explicitly specify the return type for getCommonStyled, TypeScript is inferring the following:
const getCommonStyled: (theme: Theme) => {
height: string;
display: string;
flexDirection: string;
padding: string;
}
This works fine for any CSS properties where the TypeScript definition allows string values, but the definition for flexDirection is more specific:
From https://github.com/frenic/csstype/blob/v3.1.2/index.d.ts#L18882:
export type FlexDirection = Globals | "column" | "column-reverse" | "row" | "row-reverse";
The way I would recommend fixing this is to specify a return type of React.CSSProperties:
const getCommonStyled = (theme: Theme): React.CSSProperties => ({
height: '100%',
display: 'flex',
flexDirection: 'column',
padding: theme.spacing(2),
})
React.CSSProperties leverages the csstype package as does MUI's types for the styled API so MUI will recognize a spread of that type as compatible. Specifying that return type will also do more immediate type checking of that method (e.g. you'll get a TypeScript error directly in getCommonStyled if you set flexDirection to something other than one of the allowed values).
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