127

Ive been getting these strange type errors on my typescript project for certain packages. Ex:

'TimeAgo' cannot be used as a JSX component.
  Its instance type 'ReactTimeago<keyof IntrinsicElements | ComponentType<{}>>' is not a valid JSX element.
    The types returned by 'render()' are incompatible between these types.
      Type 'React.ReactNode' is not assignable to type 'import("/home/user/app/node_modules/@types/react-bootstrap-table-next/node_modules/@types/react/index").ReactNode'.
        Type '{}' is not assignable to type 'ReactNode'.

I don't get these type errors on my local windows machine but they keep occurring in my linux virtual machine. I've deleted the project many times, cloned my repo and installed packages again in different versions of node and I still get the same type errors.

Checked node 12.18.3, 16.13.1

Here is some quick package json info:

"react-timeago": "^6.2.1",
"react-custom-scrollbars": "^4.2.1",
"react-custom-scrollbars-2": "^4.4.0",
"react": "^17.0.2",
"next": "^12.1.1",
"@types/react-custom-scrollbars": "^4.0.10",
"@types/react-timeago": "^4.1.3",
"@types/react": "^17.0.44",
"typescript": "^4.3.5"
"@types/node": "^14.18.12",

This happens on basic custom components:

MyTst.tsx
import TimeAgo from "react-timeago";

const Mytst = () => {
  return (
    <div>
      <TimeAgo date={"02/02/2022"} />
    </div>
  );
};

export default Mytst;

I get this error for react-custom-scrollbars-2 as well. There seems to be an issue with matching the types correctly between the library which contains the component and the @types files associated with them. Anyone have any ideas on how to resolve these type errors?

Ray
  • 1,548
  • 2
  • 11
  • 18
  • 2
    I'm getting similar "TS2786: 'NumberFormat' cannot be used as a JSX component. Its instance type 'NumberFormat' is not a valid JSX element." Do you know if you got this after upgrading to cra v5 or React v18? I'm wondering if that is connected. – user1259167 Apr 11 '22 at 09:05
  • 1
    Having similar issues with several 3rd party components used in project. Was not an issue till about 7th April and started to happen recently. Do not know the cause yet. – matprzybyla Apr 11 '22 at 12:18

19 Answers19

306

Had the same issue. Just add this

"resolutions": {
  "@types/react": "17.0.2",
  "@types/react-dom": "17.0.2"
},

to package.json file and run yarn command.

UPD: Just a bit detailed answer:

@types/react-dom has its own dependencies and one of them is @types/react with a version set to '*' - a major release, that now, probably, refers to 18.

Even if you specify some strict versions in your package.json (without ^) parent package might install its own duplicates of packages that you are already using for its own purposes.

By using resolutions we are specifying strict restrictions for dependencies of dependencies.

Yevhen Rybak
  • 3,084
  • 1
  • 4
  • 3
  • 3
    This fixed it for me, thanks. Builds had worked locally but not in our CI Alpine container. Looks like some sort of typing version discrepancy may have potentially been pushed to react or related libraries in NPM. – Brandon Wright Apr 11 '22 at 19:49
  • @BrandonWright see the updated comment, maybe it will help you during your debugging. And if this solution does not work for you: 1. Maybe you are using `npm` instead of `yarn`. NPM is not supporting `resolutions`. 2. Maybe your CI caching versions of downloaded packages and I'm not sure how `resolutions` are cached. You may want to try to clear that cache. – Yevhen Rybak Apr 11 '22 at 21:05
  • 6
    I had to add the package.json resolution at the root of my Lerna setup for it to work – Stephane Apr 12 '22 at 18:53
  • 2
    By downgrading @types/react version worked for me "dependencies": { "@types/react": "^17.0.0", } – mohit uprim May 15 '22 at 06:46
  • where did resolution property come from ?! I cannot make it work on heroku. – Herbert Pimentel May 17 '22 at 12:31
  • not working for me =( – Matteo Aug 30 '22 at 08:08
  • Is this still up to date ? why would you want a lower typing version than the version of react ? – Dimitri Kopriwa Dec 08 '22 at 10:29
64

You will need to fix the version for @types/react package because many react libraries have dependency set as @types/react : "*", which will take the latest version of the package. (I suppose they just released version 18)

To do that you can add this in your package.json

"resolutions": {
  "@types/react": "^17.0.38"
}

It will just work fine with yarn, but if you are using npm, then you will also need to add this in "scripts" section of your package.json

"preinstall": "npm install --package-lock-only --ignore-scripts && npx npm-force-resolutions"

This will simply use npm-force-resolutions package to fix versions from resolutions.

And then after doing npm install, your app should work just fine.

Sahil Patel
  • 816
  • 5
  • 6
  • thanks, man, only adding `"resolutions"` didn't work for me where everyone is talking about. needed this `preinstall` script. – Mejan Aug 29 '22 at 22:46
7

I known issued today

rm -rf node_modules
rm -rf yarn.lock
npm install

just used npm install sovled problem but I don't know what happend

Michael Lim
  • 159
  • 1
  • 2
  • I tried this approach on the project folder once I cloned my repo. I still get the error. This seems to be with a handful of libraries and not all of them (with the 2 mentioned above being the main ones). Do I need to remove the npde_modules globally on my machine to see if that works? Im not too familiar with the inner workings. I assumed removing node_modules in the project folders along with what you had above would do the trick but still get that same error. – Ray Apr 08 '22 at 11:45
  • Interestingly, I search for solution and ended up with this solution. Every time works... – farukbigez May 08 '22 at 08:59
  • 1
    You remove the yarn.lock file, but then install the dependencies with npm? Not very consistent, now, is it? ;) – Nemanja Milosavljevic Sep 09 '22 at 15:36
7

Had this with Styled Components. Resolutions didn't work for me so here's another solution:

Brute force type casting:

const ThemeProviderFixed = ThemeProvider as unknown as React.FC<PropsWithChildren<{ theme: string }>>;
Chris Webb
  • 752
  • 7
  • 22
  • 1
    Thanks for solution. I did the same thing to resolve problem. import ReactShadowRoot from 'react-shadow-root'; const ReactShadowRootFixed = ReactShadowRoot as unknown as React.FC>; – Frank Guo May 07 '22 at 14:00
  • 1
    Thank you!! after so many hours of searching, finally a solution that worked for me! – L. Wolf May 23 '22 at 07:17
7

I recently ran into this with a Yarn monorepo where a Typescript create-react-app subproject had installConfig.hoistingLimits=workspace. This configuration prevents hoisting of dependencies to the top-level of the monorepo.

When running react-scripts start, the type checker was still looking at the top-level @types and not finding the matching @types/react for the version of React configured on the project. The fix that resolved it was to add the following to the tsconfig.json in the subproject:

"compilerOptions": {
  ...
  "typeRoots": ["./node_modules/@types"]
},
...

This points Typescript at the type definitions that are installed for the specific sub-project.

kldavis4
  • 2,177
  • 1
  • 22
  • 33
6

Sahil's answer is correct for npm and yarn, but if you are using pnpm, you need a slightly different setup in your package.json file:

"pnpm": {
  "overrides": {
    "@types/react": "^17.0.38"
  }
}

If you are using a monorepo with several packages, this only works at the root package.json file of your repo. You can read more about it here in the pnpm docs.

Bruno Paulino
  • 5,611
  • 1
  • 41
  • 40
5

I also had the same issue, so I updated npm version ^6.0.0 -> 8.0.0 and it was resolved.

Check npm version.

beginnery
  • 81
  • 1
  • 4
4

I came across this issue recently when upgrading to React 18 and forgetting to upgrade my corresponding types in devDependencies.

What worked for me was upgrading React types to match in the package.json file as shown

{
    ...
    "dependencies": {
        ...
        "react": "^18.1.0",
    },
    "devDependencies": {
        ...
        "@types/react": "^18.0.8",
    }
}
  • 1
    yes, I matched the @type/(xxx) versions with the (xxx) versions and it worked. Did it for both react & react-dom. The version that worked for me is 17.0.2 for both of them. – felixmp May 09 '22 at 15:46
  • This solved my problem in a Turborepo monorepo, in which a components package were using a different version of react than an app package. – Joe Lapp Feb 03 '23 at 16:51
3

Ok. I ended up fixing this problem but to warn you in advance, there wasn't a magical way to do this.

I basically uninstalled all the @types I think were the offenders. You can find this out by reading your error window. The key was this message in my original error above.

Type 'React.ReactNode' is not assignable to type 'import("/home/user/app/node_modules/@types/react-bootstrap-table-next/node_modules/@types/react/index").ReactNode'.

If you see where the node module types are pointing to and its not associated with your library, then remove it. In my case, my issue was the package TimeAgo and the type error was showing that types were assigned to a different package. So I uninstalled it and kept cycling through the errors until it went away.

Then I use npm run build to do type checks and instruct me which types I had to reinstall. (There is probably a better way to do this part but it worked for me even though it was tedious.)

This issue seems to happen when you have a ton of different libraries and their types that have similar dependencies and overtime if they aren't needed, don't do what I do and just keep them piled up in your package.json.

So if you think any type can have conflicts with your library, uninstall and see if the error goes away, and then reinstall if other type errors appear that say the dev type package is missing. I also had some @type packages as dependencies instead of devDependencies which I removed and moved back into dev. Don't know if that played a part.

When in doubt, remove all applicable types and see if the issue is resolved.

Ray
  • 1,548
  • 2
  • 11
  • 18
2

If you have older version of npm, just update npm to version > 8.0.0. It worked for me.

I had npm version 6.x.x. I tried many solutions, but update npm to new version fix this problem easy.

Vít Zadina
  • 168
  • 8
2

for npm!

check which version of node and npm you have installed. if you update to 8.x, npm provides you the same thing as resolution does for yarn but its"overrides". update your package like this:

"overrides": {
  "@types/react": "17.x.x",
  "@types/react-dom": "17.x.x"
}

my npm and node versions were up to date on local instance, but not on git ci. After the update, it was working without to override the versions for react and react-dom.

lmstack
  • 15
  • 1
2

Unfortunately in my case I can't use the most voted answer since I need @types18 since I need to use the latest hooks from react@18 like useId and I can't import them using @types/react@17 since they have no exported members for those hooks. I was able to use latest types fixing the broken typed deps, thanks to @Chris Web' s answer. For example for the Redux Provider:

// temp fix due to @types/react@18
const Provider = _Provider as unknown as React.FC<{
  children?: JSX.Element | string;
  store: any;
}>;

The store: any is not ideal, but it's just a temp fix.

Cesare Polonara
  • 3,473
  • 1
  • 9
  • 19
1

You can solve this issue by following the above solution for react

"resolutions": { "@types/react": "17.0.2", "@types/react-dom": "17.0.2" },

and for react-native you don't need to add type for react-dom

"resolutions": {
"@types/react": "17.0.2",

}, After this if you still getting error for react types, add the type package separetly for react

npm install -D @types/react@17.0.2

Note - don't add "^" in resolution as it will try to install the latest version of packages which may cause the same problem.

1

Problem

For those who have this type of error in the APP and are using yarn instead of npm.

Solution

Just add the to resolutions and preinstall script inside the package.json file and them execute yarn preinstall and yarn.

  • package.json
"resolutions": {
    .....
    "@types/react": "^17.0.38"
    ....
  },


"scripts": {
    ......
    "preinstall": "yarn --package-lock-only --ignore-scripts"
    ......
  },

References

oviniciusfeitosa
  • 915
  • 1
  • 11
  • 12
1

Slightly different answer that worked for me (in case the above doesn't work for you). I had a node_modules folder in my user root. So my project folder looked like this:

~/checkouts/project/node_modules

but I also had a node_modules folder installed at the user root (probably an accident at some point):

~/node_modules

The way npm packages work is it crawls up the directory structure grabbing npm packages along the way. After removing this directory the problem went away.

Matt Coady
  • 3,418
  • 5
  • 38
  • 63
0

Tested this on two windows machines one mac and one ubuntu. One win machines was fine (no error on build), the other wind machine gave this error on build. Mac was also fine but ubuntu was also giving this error on build. I was frustrated. Tested with different node versions but that did not help. In the end had to update some types versions (not sure though if all four needed to be updated but after the update error disappeared):

"@types/react": "^16.14.3",
"@types/react-dom": "^16.9.10",
"@types/react-router": "^5.1.11",
"@types/react-router-dom": "^5.1.7",

to:

"@types/react": "^18.0.15",
"@types/react-dom": "^18.0.6",
"@types/react-router": "^5.1.18",
"@types/react-router-dom": "^5.3.3",
Orhan
  • 1,395
  • 13
  • 12
0

i tried it in two ways, with yarn's resolution it solved it, but then i deleted my yarn.lock and updated the react's type and it worked for me too without using yarn's resolution

yarn upgrade @types/react@^18.0.21
BrianRonin
  • 11
  • 2
-1

I posted a different answer but it was basically a duplicate answer so I'll provide another approach.

If you're using yarn, you can run yarn dedupe and it will make the necessary changes to your yarn.lock file. It will consolidate any references to the same package to resolve to the correct version. As you can see from here, the - lines are what were removed and the + line is modified and saved:

-"@types/react@npm:*, @types/react@npm:>=15, @types/react@npm:>=16.9.0":
-  version: 17.0.43
-  resolution: "@types/react@npm:17.0.43"
-  dependencies:
-    "@types/prop-types": "*"
-    "@types/scheduler": "*"
-    csstype: ^3.0.2
-  checksum: 981b0993f5b3ea9d3488b8cc883201e8ae47ba7732929f788f450a79fd72829e658080d5084e67caa008e58d989b0abc1d5f36ff0a1cda09315ea3a3c0c9dc11
-  languageName: node
-  linkType: hard
-
-"@types/react@npm:^18.0.0":
+"@types/react@npm:*, @types/react@npm:>=15, @types/react@npm:>=16.9.0, @types/react@npm:^18.0.0":
"@types/react@npm:*, @types/react@npm:>=15, @types/react@npm:>=16.9.0"

was consolidated into

"@types/react@npm:*, @types/react@npm:>=15, @types/react@npm:>=16.9.0, @types/react@npm:^18.0.0"
hellatan
  • 3,517
  • 2
  • 29
  • 37
  • Running `yarn dedupe` returns: error The dedupe command isn't necessary. `yarn install` will already dedupe. – Richard Apr 18 '22 at 20:46
  • hmm...interesting. I haven't run into that particular error. Which yarn version are you using? We're on 3 with workspaces. – hellatan Apr 29 '22 at 00:35
  • It looks like `yarn dedupe` was "re-added" into version 2/3? I'm still on yarn 1 until dependabot works with the recent version – Richard Apr 29 '22 at 04:21
  • You can also just manually delete those lines in yarn.lock and reinstall with `yarn install` and the effect should be the same. – Chris May 25 '23 at 18:35
-1

In my case, I put the wrong type of value inside a div.

Error

enter image description here

Reason

enter image description here enter image description here enter image description here

Fix

enter image description here

Lojith Vinsuka
  • 906
  • 1
  • 10
  • 8