import * as React from 'react'; import { Theme } from '@material-ui/core'; import { AppBarProps } from '@material-ui/core/AppBar'; import { createStyles, makeStyles } from '@material-ui/styles'; // makeStyles { interface StyleProps { color?: 'blue' | 'red'; } const styles = (theme: Theme) => createStyles({ root: (props: StyleProps) => ({ backgroundColor: props.color || theme.palette.primary.main, }), }); const useMyStyles = makeStyles(styles); interface MyComponentProps extends StyleProps { message: string; } const MyComponent = (props: MyComponentProps) => { const { color, message } = props; // @ts-expect-error Expected 1 argument, but got 0 const emptyClasses = useMyStyles(); const classes = useMyStyles(props); // @ts-expect-error const invalidClasses = useMyStyles({ colourTypo: 'red' }); // @ts-expect-error const undefinedClassName = classes.toot; return (
{color}: {message}
); }; // testing options makeStyles(styles, { flip: true, name: 'some-sheet', generateId: (_, sheet) => (sheet ? sheet.classes.root : 'no-sheet'), }); makeStyles(styles, { // rules are added at runtime so no compile time error generateId: (_, sheet) => (sheet ? sheet.classes.toot : 'no-sheet'), }); // optional props const useWithoutProps = makeStyles((theme: Theme) => createStyles({ root: { background: 'none', }, }), ); const chartStyles = { chart: { width: '100%', height: 70, backgroundColor: '#f9f9f9', }, }; const useChartClasses = makeStyles(chartStyles); const NoPropsComponent = () => { const classes = useWithoutProps(); const chartClasses = useChartClasses(); const alsoClasses = useWithoutProps(5); }; // unsafe any props make the param optional const useUnsafeProps = makeStyles( createStyles({ root: (props: any) => ({ backgroundColor: props.deep.color, }), }), ); const UnsafeProps = (props: StyleProps) => { // @ts-expect-error const classes = useUnsafeProps(); // runtime: Can't read property color of undefined // but this would pass anyway const alsoClasses = useUnsafeProps(undefined); // runtime: Can't read property color of undefined }; // default theme interface CustomTheme { attribute: number; [key: string]: any; } const validCustomTheme = { attribute: 8, otherStuff: true }; const invalidCustomTheme = { otherStuff: true }; const style = (theme: CustomTheme) => createStyles({ root: { margin: theme.attribute, }, }); makeStyles(style, { defaultTheme: validCustomTheme, }); makeStyles(style, { // @ts-expect-error defaultTheme: invalidCustomTheme, }); // Use styles with props and theme without createStyles makeStyles((theme: Theme) => ({ root: (props: StyleProps) => ({ background: props.color, color: theme.palette.primary.main, }), })); { // If any generic is provided, inferrence breaks. // If the proposal https://github.com/Microsoft/TypeScript/issues/26242 goes through, we can fix this. const useStyles = makeStyles((theme) => ({ root: { background: 'blue', }, })); const classes = useStyles(); // This doesn't fail, because inferrence is broken classes.other; } }