UNPKG

1.83 kBTypeScriptView Raw
1import * as React from 'react';
2import { Omit } from '@material-ui/types';
3import { StyledComponentProps } from './styles';
4
5/**
6 * A component whose root component can be controlled via a `component` prop.
7 *
8 * Adjusts valid props based on the type of `component`.
9 */
10export interface OverridableComponent<M extends OverridableTypeMap> {
11 <C extends React.ElementType>(props: { component: C } & OverrideProps<M, C>): JSX.Element;
12 (props: DefaultComponentProps<M>): JSX.Element;
13}
14
15/**
16 * Props of the component if `component={Component}` is used.
17 */
18// prettier-ignore
19export type OverrideProps<
20 M extends OverridableTypeMap,
21 C extends React.ElementType
22> = (
23 & BaseProps<M>
24 & Omit<React.ComponentPropsWithRef<C>, keyof CommonProps<M>>
25);
26
27/**
28 * Props if `component={Component}` is NOT used.
29 */
30// prettier-ignore
31export type DefaultComponentProps<M extends OverridableTypeMap> =
32 & BaseProps<M>
33 & Omit<React.ComponentPropsWithRef<M['defaultComponent']>, keyof BaseProps<M>>;
34
35/**
36 * Props defined on the component (+ common material-ui props).
37 */
38// prettier-ignore
39export type BaseProps<M extends OverridableTypeMap> =
40 & M['props']
41 & CommonProps<M>;
42
43/**
44 * Props that are valid for material-ui components.
45 */
46export interface CommonProps<M extends OverridableTypeMap>
47 extends StyledComponentProps<M['classKey']> {
48 className?: string;
49 style?: React.CSSProperties;
50}
51
52export interface OverridableTypeMap {
53 props: {};
54 defaultComponent: React.ElementType;
55 classKey: string;
56}
57
58/**
59 * @deprecated Not used in this library.
60 */
61export type Simplify<T> = T extends any ? { [K in keyof T]: T[K] } : never;
62
63/**
64 * @deprecated Not used in this library.
65 */
66// tslint:disable-next-line: deprecation
67export type SimplifiedPropsOf<C extends React.ElementType> = Simplify<React.ComponentProps<C>>;