TypeScript: Cannot use import statement outside a module

avatar

Borislav Hadzhiev

Last updated: Jul 25, 2022

banner

Photo from Unsplash

TypeScript: Cannot use import statement outside a module #

To solve the error "Cannot use import statement outside a module" in TypeScript, set the module option to commonjs in your tsconfig.json file and make sure to compile your TypeScript files (e.g. with ts-node), and not to run them directly with node.

cannot use import statement outside module

First, make sure the module option in your tsconfig.json file is set to commonjs.

tsconfig.json
{ "compilerOptions": { "target": "es6", "module": "commonjs", "esModuleInterop": true, // ... your other options } }

The module option sets the module system for the program.

The esModuleInterop option is set to false by default.

This causes it to treat CommonJS modules similarly to ES6 modules and may cause some issues. Setting esModuleInterop to true fixes these issues.

Another common cause of the "Cannot use import statement outside a module" error in TypeScript is trying to run a TypeScript file directly with node, e.g. node src/index.ts.

This doesn't work, because we first have to transpile the file to JavaScript before we run it with node.

The same is the case if you have incorrectly configured a TypeScript project that uses babel or ts-node.

Are your TypeScript files getting transpiled to JavaScript files in your build directory? Your build directory should only contain JavaScript files. If it contains TypeScript files, you have configured your project incorrectly.

If your project uses ts-node, you can try to add an override in your tsconfig.json, that sets module to commonjs.

tsconfig.json
{ "ts-node": { // these options are overrides used only by ts-node "compilerOptions": { "module": "commonjs" } }, "compilerOptions": { // ... your options }, }
Another thing you should check is that the main property in your package.json file points to your index.js file, and not your index.ts file.

Take a look at the build folder, which you've set via the outDir option in your tsconfig.json file. Your config could be wrong and you could still be producing TypeScript files in your build directory.

If none of the suggestions above work, take a look at a working config for a TypeScript project that uses ts-node.

This is my tsconfig.json file.

tsconfig.json
{ "compilerOptions": { "skipLibCheck": true, "target": "es6", "module": "commonjs", "moduleResolution": "node", "allowJs": true, "resolveJsonModule": true, "esModuleInterop": true, "outDir": "./build", "rootDir": "src", }, "include": ["src/**/*"], "exclude": ["node_modules"] }

Make sure the include array points to a directory that contains all of the necessary files for your project.

This is my package.json file.

package.json
{ "name": "example", "version": "1.0.0", "main": "build/index.js", "scripts": { "build": "rimraf ./build && tsc", "dev": "nodemon", "start": "npm run build && node build/index.js", }, "devDependencies": { "@types/node": "^17.0.21", "nodemon": "^2.0.15", "rimraf": "^3.0.0", "ts-node": "^10.4.0", "typescript": "^4.6.2" } }

And here is the nodemon.json configuration file, which is located in the same directory.

nodemon.json
{ "watch": ["src"], "ext": ".ts,.js", "ignore": [], "exec": "ts-node --files ./src/index.ts" }
This project structure assumes that you place all of your TypeScript files in a directory called src and have an index.ts entry point under src/index.ts.

The ts-node package will transpile your code to JavaScript and will run it with node.

Your build files will be in the build directory. Note that your build directory should not contain any TypeScript files, it should only contain JavaScript files.

If your build directory contains TypeScript files, you have a configuration error in your project.

Conclusion #

To solve the error "Cannot use import statement outside a module" in TypeScript, set the module option to commonjs in your tsconfig.json file and make sure to compile your TypeScript files (e.g. with ts-node), and not to run them directly with node.

I wrote a book in which I share everything I know about how to become a better, more efficient programmer.
book cover
You can use the search field on my Home Page to filter through all of my articles.