TypeScript getting error TS2304: cannot find name ' require'
Solution 1:
Quick and Dirty
If you just have one file using require, or you're doing this for demo purposes you can define require at the top of your TypeScript file.
declare var require: any
TypeScript 2.x
If you are using TypeScript 2.x you no longer need to have Typings or Definitely Typed installed. Simply install the following package.
npm install @types/node --save-dev
The Future of Declaration Files (6/15/2016)
Tools like Typings and tsd will continue to work, and we’ll be working alongside those communities to ensure a smooth transition.
Verify or Edit your src/tsconfig.app.json so that it contains the following:
...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...
Make sure is the file in the src folder and no the one on the root app folder.
By default, any package under @types is already included in your build unless you've specified either of these options. Read more
TypeScript 1.x
Using typings (DefinitelyTyped's replacement) you can specify a definition directly from a GitHub repository.
Install typings
npm install typings -g --save-dev
Install the requireJS type definition from DefinitelyType's repo
typings install dt~node --save --global
Webpack
If you are using Webpack as your build tool you can include the Webpack types.
npm install --save-dev @types/webpack-env
Update your tsconfig.json
with the following under compilerOptions
:
"types": [
"webpack-env"
]
This allows you to do require.ensure
and other Webpack specific functions.
Angular CLI
With CLI you can follow the Webpack step above and add the "types" block to your tsconfig.app.json
.
Alternatively, you could use the preinstalled node
types. Keep in mind this will include additional types to your client-side code that are not really available.
"compilerOptions": {
// other options
"types": [
"node"
]
}
Solution 2:
For TypeScript 2.x, there are now two steps:
-
Install a package that defines
require
. For example:npm install @types/node --save-dev
-
Tell TypeScript to include it globally in
tsconfig.json
:{ "compilerOptions": { "types": ["node"] } }
The second step is only important if you need access to globally available functions such as require
. For most packages, you should just use the import package from 'package'
pattern. There's no need to include every package in the tsconfig.json types array above.
Solution 3:
You can
declare var require: any
Or, for more comprehensive support, use DefinitelyTyped's require.d.ts
Also, instead of var mongoose = require('mongoose')
, you could try the following
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
Solution 4:
In my case, it was a super stupid problem, where the src/tsconfig.app.json
was overriding the tsconfig.json
setting.
So, I had this in tsconfig.json
:
"types": [
"node"
]
And this one in src/tsconfig.app.json
:
"types": []
I hope someone finds this helpful, as this error was causing me gray hairs.
Solution 5:
This answer relates to modern setups (TypeScript 2.x, Webpack > 2.x)
You don't need to install @types/node (which is all of Node.js types and is irrelevant for front-end code, actually complicating things such as setTimout different return values, etc..
You do need to install @types/webpack-env
npm i -D @types/webpack-env
which gives the runtime signatures that Webpack has (including require
, require.ensure
, etc.)
Also make sure that your tsconfig.json file has no set 'types' array -> which will make it pickup all type definitions in your node_modules/@types folder.
If you want to restrict search of types you can set the typeRoot property to node_modules/@types.