Skip to content

Instantly share code, notes, and snippets.

@JuHwon
Created November 5, 2020 15:21
Show Gist options
  • Save JuHwon/ab697c65ae6780d712c44872cba0b1f7 to your computer and use it in GitHub Desktop.
Save JuHwon/ab697c65ae6780d712c44872cba0b1f7 to your computer and use it in GitHub Desktop.
Overridable React Component Example
import * as React from "react";
import "./styles.css";
type OverrideComponentProps<C extends React.ElementType, P = {}> = P &
Omit<React.ComponentProps<C>, keyof P>;
type OverridableComponentProps<C extends React.ElementType, P = {}> = {
component?: C;
} & OverrideComponentProps<C, P>;
type OverridableComponent<D extends React.ElementType, P = {}> = <
C extends React.ElementType = D
>(
props: OverridableComponentProps<C, P>
) => JSX.Element;
interface ButtonProps {
className?: string;
style?: React.CSSProperties;
}
const Button: OverridableComponent<"button", ButtonProps> = (props) => {
const { component: Component = "button", ...rest } = props;
return <Component {...rest} />;
};
export default function App() {
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
<Button type="submit">Button</Button>
<Button component="a" href="#" target="_blank">
Link
</Button>
</div>
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment