From 4e2e9705b8b4640040415f7e39b73a4f0d10668f Mon Sep 17 00:00:00 2001 From: Angelo Ashmore Date: Wed, 2 Mar 2022 16:33:33 -1000 Subject: [PATCH] fix: better support for custom `` components using `forwardRef()` --- src/PrismicLink.tsx | 46 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/src/PrismicLink.tsx b/src/PrismicLink.tsx index d995f39..413aec3 100644 --- a/src/PrismicLink.tsx +++ b/src/PrismicLink.tsx @@ -6,16 +6,6 @@ import { isInternalURL } from "./lib/isInternalURL"; import { usePrismicContext } from "./usePrismicContext"; -// This module-specific `forwardRef()` type override adds support for -// components using generics in its props type. -// -// Other modules will not be affected. -declare module "react" { - function forwardRef>( - render: (props: P, ref: React.Ref) => JSX.Element | null, - ): (props: P & React.RefAttributes) => JSX.Element | null; -} - /** * Props provided to a component when rendered with ``. */ @@ -51,8 +41,8 @@ export type PrismicLinkProps< ExternalComponent extends React.ElementType = React.ElementType, LinkResolverFunction extends prismicH.LinkResolverFunction = prismicH.LinkResolverFunction, > = Omit< - React.ComponentProps & - React.ComponentProps, + React.ComponentPropsWithoutRef & + React.ComponentPropsWithoutRef, keyof LinkProps > & { /** @@ -146,30 +136,14 @@ const _PrismicLink = < InternalComponent extends React.ElementType = typeof defaultInternalComponent, ExternalComponent extends React.ElementType = typeof defaultExternalComponent, LinkResolverFunction extends prismicH.LinkResolverFunction = prismicH.LinkResolverFunction, - Ref extends - | (InternalComponent extends keyof HTMLElementTagNameMap - ? HTMLElementTagNameMap[InternalComponent] - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - any) - | (ExternalComponent extends keyof HTMLElementTagNameMap - ? HTMLElementTagNameMap[ExternalComponent] - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - any) = - | (InternalComponent extends keyof HTMLElementTagNameMap - ? HTMLElementTagNameMap[InternalComponent] - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - any) - | (ExternalComponent extends keyof HTMLElementTagNameMap - ? HTMLElementTagNameMap[ExternalComponent] - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - any), >( props: PrismicLinkProps< InternalComponent, ExternalComponent, LinkResolverFunction >, - ref: React.ForwardedRef, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ref: React.Ref, ): JSX.Element | null => { const context = usePrismicContext(); @@ -239,4 +213,14 @@ const _PrismicLink = < ) : null; }; -export const PrismicLink = React.forwardRef(_PrismicLink); +export const PrismicLink = React.forwardRef(_PrismicLink) as < + InternalComponent extends React.ElementType, + ExternalComponent extends React.ElementType, + LinkResolverFunction extends prismicH.LinkResolverFunction, +>( + props: PrismicLinkProps< + InternalComponent, + ExternalComponent, + LinkResolverFunction + > & { ref?: React.Ref }, +) => JSX.Element | null;