facebook / react

The library for web and native user interfaces.
https://react.dev
MIT License
225.96k stars 46.1k forks source link

[Compiler Bug]: Runtime error with Higher Order Components #29755

Open NickBlow opened 2 months ago

NickBlow commented 2 months ago

What kind of issue is this?

Link to repro

https://codesandbox.io/p/devbox/vite-react-forked-w7lfc7?file=%2Fsrc%2FApp.tsx&workspaceId=5309445f-fc83-4685-b2a0-3050725a1482

Repro steps

We're just going through our codebase and fixing issues that we're getting when enabling the compiler.

Not sure if this is something we are doing wrong, or a compiler issue.

We get 'TypeError: Cannot read properties of null (reading 'useMemoCache')' when running something similar to the following code in NextJS (minimal repro):

Passing in a string as ElementType seems to be something that's fairly commonly recommended (https://www.aleksandrhovhannisyan.com/blog/dynamic-tag-name-props-in-react/ is the first result on Google for me).

import React, { ElementType, FC } from "react";

function TagChangingHOC(Tag: ElementType): FC<{text: string}> {
    return function({text}) {
        return <Tag>{text}</Tag>
    }
}

const DivTag = TagChangingHOC('div');
const SpanTag = TagChangingHOC('span');

export default function MyApp() {
    return (<> <DivTag text="foo"/> <SpanTag text="bar"/> </>)
}

https://playground.react.dev/#N4Igzg9grgTgxgUxALhAHQHaYGZQ3AFwEsIMACAFQEMBzAYQAsqMaiWAJAeToApqaAlGWCYyZGAgKxyufMVJkewMgQQAPAmQC+QkeTHjJ0sgB5+APmCqNWkwHoLo7Zi2ZMcUmE0ARIgDd+MgBeSlpGZlYObh4AcgATfxiBAG53T00AZQAHZkCQ-nCWNhouXhiwHIwk1KwMdSyIGE04hGwqKAAbTVlCEnIAWQBPAEEsrJ5dJwkpGHIeE3NTXwDaFXUCILQQbAgILbtFk2zc1esNrYAjKhh9w4OBF0wQLSA

I'm very happy to accept an alternative solution if this is too much of an edge case.

How often does this bug happen?

Every time

What version of React are you using?

19.0.0-rc.0

josephsavona commented 1 month ago

I think what's happening here is that the HOC (TagChangingHOC) is being identified by the compiler as a component because its name is capitalized and it creates JSX somewhere. We can certainly try to identify HOCs more accurately, but for now a couple options: