diff --git a/packages/material-ui/src/Button/Button.d.ts b/packages/material-ui/src/Button/Button.d.ts index 20219e57ce0f74..5cff16988662ef 100644 --- a/packages/material-ui/src/Button/Button.d.ts +++ b/packages/material-ui/src/Button/Button.d.ts @@ -1,9 +1,9 @@ import { PropTypes } from '..'; -import { ExtendButtonBase } from '../ButtonBase'; -import { SimplifiedPropsOf } from '../OverridableComponent'; +import { ExtendButtonBase, ExtendButtonBaseTypeMap } from '../ButtonBase'; +import { OverridableComponent, OverrideProps, SimplifiedPropsOf } from '../OverridableComponent'; -declare const Button: ExtendButtonBase<{ - props: { +export type ButtonTypeMape = ExtendButtonBaseTypeMap<{ + props: P & { color?: PropTypes.Color; disabled?: boolean; disableFocusRipple?: boolean; @@ -13,11 +13,16 @@ declare const Button: ExtendButtonBase<{ size?: 'small' | 'medium' | 'large'; variant?: 'text' | 'outlined' | 'contained'; }; - defaultComponent: 'button'; + defaultComponent: D; classKey: ButtonClassKey; }>; -export type ButtonProps = SimplifiedPropsOf; +declare const Button: ExtendButtonBase>; + +export type ButtonProps = OverrideProps< + ButtonTypeMape, + D +>; export type ButtonClassKey = | 'root' diff --git a/packages/material-ui/src/Button/Button.spec.tsx b/packages/material-ui/src/Button/Button.spec.tsx new file mode 100644 index 00000000000000..043a159839cf78 --- /dev/null +++ b/packages/material-ui/src/Button/Button.spec.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import Button, { ButtonProps } from '@material-ui/core/Button'; +import { Link as ReactRouterLink, LinkProps } from 'react-router-dom'; +import { type } from 'os'; + +const log = console.log; + +const TestOverride = React.forwardRef((props, ref) => ( +
+)); + +const ButtonTest = () => ( +
+ + + + + + + + + + + + + + + // By default the underlying component is a button element: + + // If an href is provided, an anchor is used: + + // If a component prop is specified, use that: + + component="div" + ref={elem => { + elem; // $ExpectType HTMLDivElement | null + }} + onClick={e => { + e; // $ExpectType MouseEvent + log(e); + }} + > + Div + + { + // Can't have an onClick handler if the overriding component doesn't specify one: + // $ExpectError + component={TestOverride} onClick={log}> + TestOverride + + } +
+); + +const ReactRouterLinkTest = () => { + const ButtonLink = (props: ButtonProps) => ( + + ); +}; diff --git a/packages/material-ui/test/typescript/components.spec.tsx b/packages/material-ui/test/typescript/components.spec.tsx index ad422b817a7916..2085a9b9f3844a 100644 --- a/packages/material-ui/test/typescript/components.spec.tsx +++ b/packages/material-ui/test/typescript/components.spec.tsx @@ -79,7 +79,6 @@ import { createStyles, } from '@material-ui/core/styles'; import { DialogProps } from '@material-ui/core/Dialog'; -import { ButtonProps } from '@material-ui/core/Button'; import { Link as ReactRouterLink } from 'react-router-dom'; import { ButtonBaseActions } from '@material-ui/core/ButtonBase'; @@ -172,78 +171,6 @@ const BottomNavigationTest = () => { ); }; -const ButtonTest = () => ( -
- - - - - - - - - - - - - - - // By default the underlying component is a button element: - - // If an href is provided, an anchor is used: - - // If a component prop is specified, use that: - - component="div" - ref={elem => { - elem; // $ExpectType HTMLDivElement | null - }} - onClick={e => { - e; // $ExpectType MouseEvent - log(e); - }} - > - Div - - { - // Can't have an onClick handler if the overriding component doesn't specify one: - // $ExpectError - component={TestOverride} onClick={log}> - TestOverride - - } -
-); - const IconButtonTest = () => (
@@ -1085,31 +1012,6 @@ const InputLabelTest = () => ( /> ); -const ReactRouterLinkTest = () => { - interface ButtonLinkProps extends ButtonProps { - to: string; - replace?: boolean; - } - - const ButtonLink = (props: ButtonLinkProps) => ( - - ); -}; - const LinkTest = () => { const dudUrl = 'javascript:;'; return (