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 = () => (
+
+
I am a button!
+
Contrast
+
Disabled
+
Link
+
Small
+
Contained
+
+ Outlined
+
+
+ Title
+
+
Simple Link
+
}>Complex Link
+
+ Link
+
+
Link
+
+ Link
+
+
Link
+ // By default the underlying component is a button element:
+
{
+ elem; // $ExpectType HTMLButtonElement | null
+ }}
+ onClick={e => {
+ e; // $ExpectType MouseEvent
+ log(e);
+ }}
+ >
+ Button
+
+ // If an href is provided, an anchor is used:
+
{
+ elem; // $ExpectType HTMLAnchorElement | null
+ }}
+ onClick={e => {
+ e; // $ExpectType MouseEvent
+ log(e);
+ }}
+ >
+ Link
+
+ // 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) => (
+
+ );
+
+ const reactRouterButtonLink1 = (
+
+ Go Home
+
+ );
+
+ const MyLink = React.forwardRef((props, ref) => {
+ return ;
+ });
+
+ const reactRouterButtonLink2 = (
+
+ Go Home
+
+ );
+};
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 = () => (
-
-
I am a button!
-
Contrast
-
Disabled
-
Link
-
Small
-
Contained
-
- Outlined
-
-
- Title
-
-
Simple Link
-
}>Complex Link
-
- Link
-
-
Link
-
- Link
-
-
Link
- // By default the underlying component is a button element:
-
{
- elem; // $ExpectType HTMLButtonElement | null
- }}
- onClick={e => {
- e; // $ExpectType MouseEvent
- log(e);
- }}
- >
- Button
-
- // If an href is provided, an anchor is used:
-
{
- elem; // $ExpectType HTMLAnchorElement | null
- }}
- onClick={e => {
- e; // $ExpectType MouseEvent
- log(e);
- }}
- >
- Link
-
- // 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 reactRouterButtonLink1 = (
-
- Go Home
-
- );
-
- const MyLink = (props: any) => ;
-
- const reactRouterButtonLink2 = (
-
- Go Home
-
- );
-};
-
const LinkTest = () => {
const dudUrl = 'javascript:;';
return (