Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / react-polymorphic-types / index.d.ts
blob31aad6c81eca512a74cfd4cfe7a567e36cdc4217
1 import type {
2     ComponentPropsWithRef,
3     ComponentPropsWithoutRef,
4     ElementType,
5     ExoticComponent,
6     ForwardRefExoticComponent,
7     JSX,
8     PropsWithRef,
9     PropsWithoutRef,
10     ReactNode,
11 } from 'react';
13 type Merge<T, U> = Omit<T, keyof U> & U;
15 type PropsWithAs<P, T extends ElementType> = P & { as?: T };
16 type UnknownProps<P> = P & { [key: string]: unknown };
18 type ExtractPropsWithRef<T> = T extends keyof JSX.IntrinsicElements
19     ? PropsWithRef<JSX.IntrinsicElements[T]>
20     : ComponentPropsWithRef<T>;
22 type ExtractPropsWithoutRef<T> = T extends keyof JSX.IntrinsicElements
23     ? PropsWithoutRef<JSX.IntrinsicElements[T]>
24     : ComponentPropsWithoutRef<T>;
26 type PolymorphicRefForwardingFunction<P, T extends ElementType> = <InstanceT extends ElementType = T>(
27     props: PolymorphicPropsWithRef<P, InstanceT>
28 ) => ReactNode;
30 type PolymorphicExoticComponent<P = {}, T extends ElementType> = Merge<
31     ExoticComponent<UnknownProps<P>>,
32     PolymorphicRefForwardingFunction<P, T>
35 export type PolymorphicPropsWithoutRef<P, T extends ElementType> = Merge<ExtractPropsWithoutRef<T>, PropsWithAs<P, T>>;
36 export type PolymorphicPropsWithRef<P, T extends ElementType> = Merge<ExtractPropsWithRef<T>, PropsWithAs<P, T>>;
38 export type PolymorphicForwardRefExoticComponent<P, T extends ElementType> = Merge<
39     ForwardRefExoticComponent<UnknownProps<P>>,
40     PolymorphicExoticComponent<P, T>