1

I'm working with React and Next.js in Typescript and I'm trying to make this wrapper component that will bundle together a Next.js <Link /> component and a <a /> tag:

import React, { forwardRef } from 'react';
import Link, { LinkProps } from 'next/link';

type EnhancedLinkProps = {
  children: React.ReactNode[];
} & LinkProps;

const EnhancedLink = forwardRef<HTMLAnchorElement, EnhancedLinkProps>(({
  as,
  passHref,
  prefetch,
  replace,
  shallow,
  scroll,
  href,
  children,
  ...rest
}, ref) => (
  <Link
    href={href}
    as={as}
    passHref={passHref}
    prefetch={prefetch}
    replace={replace}
    shallow={shallow}
    scroll={scroll}
    href={href}
  >
    <a {...rest} ref={ref}>
      {children}
    </a>
  </Link>
))

export default EnhancedLink;

Problem is that I want to support forwarding refs, but as soon as I wrap my function in forwardRef typescript fails to parse my JSX. I get this error message on the line with <Link...:

"'Link' refers to a value, but is being used as a type here. Did you mean 'typeof Link'?ts(2749)"

Seems like it is maybe registering the <> around Link as Typescript syntax.

I used this example to set up my forwardRef as typescript code:

type Props = { children: React.ReactNode; type: "submit" | "button" };
export type Ref = HTMLButtonElement;
export const FancyButton = React.forwardRef<Ref, Props>((props, ref) => (
  <button ref={ref} className="MyClassName" type={props.type}>
    {props.children}
  </button>
));

Taken from here. I was assuming that the example should be good, but when I copy paste that directly into my code, I also get an error on the line where the JSX starts (i.e. <button>...):

"Cannot find name 'button'.ts(2304)"

Button is just a good old HTML element, so it's definitely not picking up the JSX here either.

I tried rewriting the arrow function with a explicit return statement. From:

() => (<button />)

To:

() => { return (<button />) }

Did not work either, same error.

What am I missing here?

1 Answer 1

2

I was missing something very obvious :)

The filename just had to be renamed from .ts to .tsx.

Sign up to request clarification or add additional context in comments.

1 Comment

Oh shoot so sorry, happened to me as well trying to make a context provider in a .ts file 😂

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.