UNPKG

1.98 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>(
12 props: {
13 /**
14 * The component used for the root node.
15 * Either a string to use a HTML element or a component.
16 */
17 component: C;
18 } & OverrideProps<M, C>
19 ): JSX.Element;
20 (props: DefaultComponentProps<M>): JSX.Element;
21}
22
23/**
24 * Props of the component if `component={Component}` is used.
25 */
26// prettier-ignore
27export type OverrideProps<
28 M extends OverridableTypeMap,
29 C extends React.ElementType
30> = (
31 & BaseProps<M>
32 & Omit<React.ComponentPropsWithRef<C>, keyof CommonProps<M>>
33);
34
35/**
36 * Props if `component={Component}` is NOT used.
37 */
38// prettier-ignore
39export type DefaultComponentProps<M extends OverridableTypeMap> =
40 & BaseProps<M>
41 & Omit<React.ComponentPropsWithRef<M['defaultComponent']>, keyof BaseProps<M>>;
42
43/**
44 * Props defined on the component (+ common material-ui props).
45 */
46// prettier-ignore
47export type BaseProps<M extends OverridableTypeMap> =
48 & M['props']
49 & CommonProps<M>;
50
51/**
52 * Props that are valid for material-ui components.
53 */
54export interface CommonProps<M extends OverridableTypeMap>
55 extends StyledComponentProps<M['classKey']> {
56 className?: string;
57 style?: React.CSSProperties;
58}
59
60export interface OverridableTypeMap {
61 props: {};
62 defaultComponent: React.ElementType;
63 classKey: string;
64}
65
66/**
67 * @deprecated Not used in this library.
68 */
69export type Simplify<T> = T extends any ? { [K in keyof T]: T[K] } : never;
70
71/**
72 * @deprecated Not used in this library.
73 */
74// tslint:disable-next-line: deprecation
75export type SimplifiedPropsOf<C extends React.ElementType> = Simplify<React.ComponentProps<C>>;