Member-only story
How to fix error TS7016: Could not find a declaration file for module ‘XYZ’. ‘file.js’ implicitly has an ‘any’ type
If you’re using TypeScript you might have run into this error before. The second part of the error says:
Try `npm install @types/XYZ` if it exists or add a new declaration (.d.ts) file containing `declare module 'XYZ';
If XYZ is a direct dependency of your project, you can follow the instructions from the error message and run npm install @types/XYZ
.
Sometimes the types might not be available and the npm install
command fails. In that case, you can use the second option and declare the module.
Here’s how I usually do that.
- Create a folder called
typings
- Create a file in that folder called
index.d.ts
- Declare the module(s) like this:
declare module 'XYZ';
Lastly, you also need to add the path to your index.d.ts
in the tsconfig.json
file under the typeRoots
element, like this:
"typeRoots": [
"./typings",
"./node_modules/@types/"
]
But ‘XYZ’ is not a direct dependency of my project
I’ve started seeing this error when I upgraded eslint to 7.4.0. And to make things even more complicated:
- It was only happening during the CI build. I tried to reproduce the issue locally on a “clean” environment and I couldn’t get it to fail.
- XYZ was not my direct dependency. My project has a dependency on “ABC” and “ABC” has a dependency on “XYZ”
It felt weird to install types for 3rd or n-party dependency and it didn’t make sense to me (I might be wrong though!).
Instead of ratholing on that, I added the following statement to thetsconfig.json
file to disable the ‘any’ type errors:
"noImplicitAny": false
Note that disabling this will disable the rule for your project as well. But at least your build will be working, until the n-th dependency fixes this issue in their codebase.