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
tsTry
define(["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
tsTry
System.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
tsTry
import { valueOfPi } from "./constants";export const twoPi = valueOfPi * 2;
ES2015
/ES6
/ES2020
/ES2022
tsTry
import { valueOfPi } from "./constants";export const twoPi = valueOfPi * 2;
In addition to the base functionality of ES2015
/ES6
, ES2020
adds support for dynamic import
s, and import.meta
while ES2022
further adds support for top level await
.
node16
/nodenext
Available from 4.7+, the node16
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.
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).
tsTry
import { 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
module
emit 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. Settingmodule
gives 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;