export type AsProp<C extends React.ElementType> = { as?: C };

export type PropsToOmit<C extends React.ElementType, P> = keyof (AsProp<C> & P);

export type PolymorphicComponentProps<
  C extends React.ElementType,
  P = object,
> = AsProp<C> & P & Omit<React.ComponentProps<C>, PropsToOmit<C, P>>;

export type PolymorphicComponent<
  P extends object = object,
  D extends React.ElementType = 'div',
> = (<C extends React.ElementType = D>(
  props: PolymorphicComponentProps<C, P>
) => React.ReactNode) & {
  displayName?: string;
};
