TSConfig
module
Sets the module system for the program. See the theory behind TypeScript’s module option and its reference page for more information. You very likely want "nodenext" for modern Node.js projects and preserve or esnext for code that will be bundled.
Changing module affects moduleResolution which also has a reference page.
Here’s some example output for this file:
tsTry// @filename: index.tsimport {valueOfPi } from "./constants";export consttwoPi =valueOfPi * 2;
CommonJS
tsTry"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.twoPi = void 0;const constants_1 = require("./constants");exports.twoPi = constants_1.valueOfPi * 2;
UMD
tsTry(function (factory) {if (typeof module === "object" && typeof module.exports === "object") {var v = factory(require, exports);if (v !== undefined) module.exports = v;}else if (typeof define === "function" && define.amd) {define(["require", "exports", "./constants"], factory);}})(function (require, exports) {"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.twoPi = void 0;const constants_1 = require("./constants");exports.twoPi = constants_1.valueOfPi * 2;});
AMD
tsTrydefine(["require", "exports", "./constants"], function (require, exports, constants_1) {"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.twoPi = void 0;exports.twoPi = constants_1.valueOfPi * 2;});
System
tsTrySystem.register(["./constants"], function (exports_1, context_1) {"use strict";var constants_1, twoPi;var __moduleName = context_1 && context_1.id;return {setters: [function (constants_1_1) {constants_1 = constants_1_1;}],execute: function () {exports_1("twoPi", twoPi = constants_1.valueOfPi * 2);}};});
ESNext
tsTryimport { valueOfPi } from "./constants";export const twoPi = valueOfPi * 2;
ES2015/ES6/ES2020/ES2022
tsTryimport { valueOfPi } from "./constants";export const twoPi = valueOfPi * 2;
In addition to the base functionality of ES2015/ES6, ES2020 adds support for dynamic imports, and import.meta while ES2022 further adds support for top level await.
node16/node18/node20/nodenext
The node16, node18, node20, and nodenext modes integrate with Node’s native ECMAScript Module support. The emitted JavaScript uses either CommonJS or ES2020 output depending on the file extension and the value of the type setting in the nearest package.json. Module resolution also works differently. You can learn more in the handbook and Modules Reference.
node16is available from TypeScript 4.7node18is available from TypeScript 5.8 as a replacement fornode16, with added support for import attributes.node20adds support for require(ESM).nodenextis available from TypeScript 4.7, but its behavior changes with the latest stable versions of Node.js.--module nodenextimplies the floating--target esnext.
preserve
In --module preserve (added in TypeScript 5.4), ECMAScript imports and exports written in input files are preserved in the output, and CommonJS-style import x = require("...") and export = ... statements are emitted as CommonJS require and module.exports. In other words, the format of each individual import or export statement is preserved, rather than being coerced into a single format for the whole compilation (or even a whole file).
tsTryimport { valueOfPi } from "./constants";const constants = require("./constants");export const piSquared = valueOfPi * constants.valueOfPi;
While it’s rare to need to mix imports and require calls in the same file, this module mode best reflects the capabilities of most modern bundlers, as well as the Bun runtime.
Why care about TypeScript’s
moduleemit with a bundler or with Bun, where you’re likely also settingnoEmit? TypeScript’s type checking and module resolution behavior are affected by the module format that it would emit. Settingmodulegives TypeScript information about how your bundler or runtime will process imports and exports, which ensures that the types you see on imported values accurately reflect what will happen at runtime or after bundling.
None
tsTry"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.twoPi = void 0;const constants_1 = require("./constants");exports.twoPi = constants_1.valueOfPi * 2;