Description
🔍 Search Terms
TS1479 is "The current file is a CommonJS module whose imports will produce 'require' calls; however, the referenced file is an ECMAScript module and cannot be imported with 'require'. Consider writing a dynamic import call instead."
But require(ESM)
is now supported -- under --experimental-require-module
in node 20.x and 22.x and by default in node 23.x -- providing that the module graph contains no top-level await. So TypeScript needs a way to disable TS1479 when a user can assert that this is the case.
✅ Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ Suggestion
"module": "nodenext"
should disable TS1479.
📃 Motivating Example
Prototype blog post announcement:
TypeScript now supports
require(ESM)
In CJS packages whose tsconfig specifies
"module": "nodenext"
, TypeScript will no longer produce an error when requiring a module known to be ESM.For example, the following will now work:
module_a/package.json
:{ ... "type": "module" }
module_a/foo.js
:export const foo = "foo"
module_a/package.json
:
(no"type": "module"
)
module_b/tsconfig.json
:{ "compilerOptions": { "module": "nodenext" } }
module_b/foo.ts
:import foo from "module_a/foo"
💻 Use Cases
- What do you want to use this for?
Interoperability between ESM and CJS. - What shortcomings exist with current approaches?
TypeScript does not allow CJS to require(ESM), even when it is supported by node. - What workarounds are you using in the meantime?
Have to avoid doing that.