@itwin/itwinui-react
Version:
A react component library for iTwinUI
29 lines (28 loc) • 1.14 kB
TypeScript
import type * as React from 'react';
export type CommonProps = {
id?: string;
className?: string;
style?: React.CSSProperties;
};
/**
* Makes `as` prop available and merges original OwnProps and the inferred props from `as` element.
* Extends ForwardRefExoticComponent so ref gets the correct type.
*
* `DefaultAs` should be the default element that is used for the `as` prop.
*
* @example
* const Button = React.forwardRef((props, forwardedRef) => {
* // ...
* }) as PolymorphicForwardRefComponent<'button', ButtonOwnProps>;
*/
export interface PolymorphicForwardRefComponent<DefaultAs, OwnProps = {}> extends React.ForwardRefExoticComponent<Merge<DefaultAs extends React.ElementType<any> ? React.ComponentPropsWithRef<DefaultAs> : never, OwnProps & {
as?: DefaultAs;
}>> {
<As = DefaultAs>(props: As extends keyof React.JSX.IntrinsicElements ? Merge<React.JSX.IntrinsicElements[As], OwnProps & {
as: As;
}> : As extends React.ComponentType<infer P> ? Merge<P, OwnProps & {
as: As;
}> : never): React.ReactElement<any> | null;
}
type Merge<P1, P2> = Omit<P1, keyof P2> & P2;
export {};