react-polymorphic-forwardref
Version:
Provides an enhanced version of "React.forwardRef" to polymorph using the "as" prop.
55 lines (45 loc) • 2.56 kB
TypeScript
import * as React from 'react';
type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : never
type Merge<A, B> = Omit<A, keyof B> & B
type DistributiveMerge<A, B> = DistributiveOmit<A, keyof B> & B
type IntrinsicElement<E> = E extends ForwardRefAsExoticComponent<infer T, any> ? T : E
type ExtendedProps<E, OwnProps> = E extends ForwardRefAsExoticComponent<any, infer P> ? Merge<P, OwnProps> : OwnProps
type PropsWithAs<
Component extends React.ElementType,
PermanentProps extends object,
ComponentProps extends object,
> = DistributiveMerge<ComponentProps, PermanentProps & { as?: Component }>
type ForwardRefAsComponentPropsWithRef<
Default extends OnlyAs,
Props extends object = {},
OnlyAs extends React.ElementType | ForwardRefAsExoticComponent<any, any, any> = React.ElementType,
> = PropsWithAs<OnlyAs, ExtendedProps<Default, Props>, React.ComponentPropsWithRef<IntrinsicElement<OnlyAs>>>
type ForwardRefAsComponentPropsWithoutRef<
Default extends OnlyAs,
Props extends object = {},
OnlyAs extends React.ElementType | ForwardRefAsExoticComponent<any, any, any> = React.ElementType,
> = PropsWithAs<OnlyAs, ExtendedProps<Default, Props>, React.ComponentPropsWithoutRef<IntrinsicElement<OnlyAs>>>
type ForwardRefAsComponentWithRef<
Default extends OnlyAs,
Props extends object = {},
OnlyAs extends React.ElementType | ForwardRefAsExoticComponent<any, any, any> = React.ElementType,
> = <T extends OnlyAs | ForwardRefAsExoticComponent<any, any, any> = Default>(
props: PropsWithAs<T, ExtendedProps<T, Props>, React.ComponentPropsWithRef<IntrinsicElement<T>>>
) => React.ReactElement | null
type ForwardRefAsExoticComponent<
Default extends OnlyAs,
Props extends object = {},
OnlyAs extends React.ElementType | ForwardRefAsExoticComponent<any, any, any> = React.ElementType,
> = Merge<React.ForwardRefExoticComponent<{}>, ForwardRefAsComponentWithRef<Default, Props, OnlyAs>>
type ForwardRefAsFunction = <
Default extends OnlyAs,
Props extends object = {},
OnlyAs extends React.ElementType | ForwardRefAsExoticComponent<any, any, any> = React.ElementType,
>(
Component: React.ForwardRefRenderFunction<
any,
PropsWithAs<OnlyAs, Props, React.ComponentPropsWithRef<Default>>
>
) => ForwardRefAsExoticComponent<Default, Props, OnlyAs>
declare const forwardRefAs: ForwardRefAsFunction;
export { type ForwardRefAsComponentPropsWithRef, type ForwardRefAsComponentPropsWithoutRef, type ForwardRefAsComponentWithRef, forwardRefAs };