The require keyword in TypeScript is really Node.js’s CommonJS require() function: it loads a module synchronously and returns its exports. In a .ts file it needs Node’s types, and it returns any, so prefer import x = require() or plain import:
import tax = require("./req_tax"); // typed CommonJS import
const raw = require("./req_tax"); // works, but raw is any
Every example here ran on TypeScript 7.0.2 and Node.js v22.22.2, compiled in strict mode. Outputs are pasted straight from those runs.
What does require() do in a TypeScript file?
It isn’t a TypeScript keyword at all (it’s missing from the TypeScript keywords list). It’s a function that CommonJS modules get from Node.js. Here’s the helper module the examples load:
export const rate = 0.0825; // Austin, TX combined sales tax
export function withTax(amount: number): number {
return Math.round(amount * (1 + rate) * 100) / 100;
}
Now a file that requires a built-in module and that helper:
const path = require("node:path");
const tax = require("./req_tax");
console.log("file:", path.join("orders", "2026", "october.csv"));
console.log("Austin order:", tax.withTax(100));
console.log("typo:", tax.withTaxx(50)); // tsc doesn't complain
Output:
file: orders\2026\october.csv
Austin order: 108.25
C:\pyguides\req_basic.js:6
console.log("typo:", tax.withTaxx(50)); // tsc doesn't complain
^
TypeError: tax.withTaxx is not a function
at Object.<anonymous> (C:\pyguides\req_basic.js:6:26)
at Module._compile (node:internal/modules/cjs/loader:1705:14)
at Object..js (node:internal/modules/cjs/loader:1838:10)
at Module.load (node:internal/modules/cjs/loader:1441:32)
at Function._load (node:internal/modules/cjs/loader:1263:12)
at TracingChannel.traceSync (node:diagnostics_channel:328:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:171:5)
at node:internal/main/run_main_module:36:49
Node.js v22.22.2

withTaxx compiles fine and only fails when Node.js runs it.That’s the catch: require() returns any, so TypeScript can’t check what you do with the result.
Fix “Cannot find name ‘require’” (TS2591)
Without Node’s type definitions, the compiler doesn’t know require exists:
const fs = require("node:fs");
console.log(fs.existsSync("orders.csv"));
Output:
req_missing.ts(1,12): error TS2591: Cannot find name 'require'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.

@types/node and list it under types.Older TypeScript versions print the same message as TS2580. The fix is identical either way, and it’s the same one I use for ReferenceError: fetch is not defined:
npm i -D @types/node
{
"compilerOptions": {
"module": "nodenext",
"types": ["node"]
}
}
On the command line, --types node does the same. TypeScript 7 doesn’t load @types packages automatically anymore, so that entry matters.
Use import x = require() for typed CommonJS imports
TypeScript’s import tax = require() form compiles to a plain require() call but keeps the module’s types. The catch is the module setting:
import tax = require("./req_tax");
console.log("Austin order:", tax.withTax(100));
console.log("typo:", tax.withTaxx(50));
Output:
req_typed.ts(1,1): error TS1202: Import assignment cannot be used when targeting ECMAScript modules. Consider using 'import * as ns from "mod"', 'import {a} from "mod"', 'import d from "mod"', or another module format instead.
req_typed.ts(4,26): error TS2551: Property 'withTaxx' does not exist on type 'typeof import("C:/pyguides/req_tax")'. Did you mean 'withTax'?

TypeScript 7 defaults module to esnext. Switch to commonjs (or nodenext) and fix the typo:
import tax = require("./req_tax");
console.log("rate:", tax.rate);
console.log("Austin order:", tax.withTax(100));
Output:
rate: 0.0825
Austin order: 108.25
Hover over tax in your editor and you’ll see the real module type instead of any (more on that in checking the type of a variable in TypeScript).
In TypeScript 7, commonjs, node16 through nodenext, and preserve accept it. amd, umd and system fail with TS5108 because they were removed.
Require a JSON file in TypeScript
require() parses .json files into objects. With import = require, TypeScript also infers the shape, since resolveJsonModule is on by default now. The file holds Austin store data:
{ "city": "Austin", "state": "TX", "taxRate": 0.0825, "lastOrder": 249.99 }
import store = require("./req_store.json"); // typed from the file
const raw = require("./req_store.json"); // any
console.log(`${store.city}, ${store.state} tax ${(store.taxRate * 100).toFixed(2)}%`);
console.log("same cached object:", raw === store);
Output:
Austin, TX tax 8.25%
same cached object: true
Both calls return the same cached object, because Node.js loads each module once. For ES module syntax and import attributes, see how to import a JSON file in TypeScript.
Why is require not defined in ES modules?
In an .mts file, or a .ts file under a "type": "module" package, require() passes type checking but Node.js throws ReferenceError: require is not defined in ES module scope. Build your own with createRequire:
import { createRequire } from "node:module";
const require = createRequire(import.meta.url);
const store = require("./req_store.json");
const tax = require("./req_tax.js");
console.log(`${store.city} last order: $${tax.withTax(store.lastOrder).toFixed(2)} with tax`);
Output:
Austin last order: $270.61 with tax
Under nodenext, TypeScript emits this same code for you when an ES module uses import x = require(). In new ESM code, a normal import is cleaner.
Can require() load an ES module in Node.js 22?
Yes. Node.js 22.12 turned on require() of ES modules without a flag, and 22.13 dropped the warning. Here’s a .cts file requiring an .mts module:
export const city = "Denver";
export default function label(amount: number): string {
return `$${amount.toFixed(2)}`;
}
const prices = require("./req_prices.mjs");
console.log(prices);
import p = require("./req_prices.mjs");
console.log(p.default(19.5), "in", p.city);
Output:
[Module: null prototype] {
__esModule: true,
city: 'Denver',
default: [Function: label]
}
$19.50 in Denver

require() returns the module namespace, with __esModule: true added because there’s a default export.The default export lands on .default, the same object shape described in the default keyword in TypeScript guide. TypeScript allows this under node20 and nodenext; node18 rejects it with TS1471.
One more limit: a module with top-level await can’t be required. Node.js throws ERR_REQUIRE_ASYNC_MODULE, so use await import() for those.
require vs import in TypeScript
| require() | import x = require() | import | |
|---|---|---|---|
| Typed result | No (any) | Yes | Yes |
| Module format | CommonJS | CommonJS (createRequire in ESM) | ESM or CommonJS |
| Needs @types/node | Yes | Yes | Only for Node APIs |
| Best for | Quick scripts, conditional loads | Typed CommonJS code | New code |
For new projects I use import with "module": "nodenext", and keep require() for old CommonJS files.
Module loading touches a lot of TypeScript, so these pages pair well with this one:
- The is keyword in TypeScript
- TypeScript interface for an array of objects
- Key-value pairs in TypeScript
- Convert a string to an enum in TypeScript
Frequently asked questions
Is require a keyword in TypeScript?
No. require is a Node.js CommonJS function. TypeScript only adds the import x = require() syntax around it.
How do I fix Cannot find name ‘require’?
Install @types/node and add "types": ["node"] to compilerOptions, or pass --types node to tsc.
Can I use require in an ES module?
Not directly. Create one with createRequire(import.meta.url) from node:module, or switch to import.
Should I use require or import in TypeScript?
Use import for new code. Keep require() for CommonJS projects or loading a module conditionally.
Where is import = require documented?
See Modules – Reference in the TypeScript handbook.

Bijay Kumar is a 13-time Microsoft MVP with more than 18 years in software development, and the founder of Python Guides and TSinfo Technologies. He started out building .NET and SharePoint solutions at HP, TCS and KPIT before moving into Python, machine learning and AI, and he also builds web apps with TypeScript and React. He writes the tutorials here himself, and every example is run before publishing so you see the real output. More about Bijay · Microsoft MVP profile · LinkedIn