You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Node 20.19.0, 22.12.0, 23.0.0 added requiring ESM files (known as require(esm)). This feature includes module.exports interop export name feature that allows users to customize what the module.exports value would be when a module is required.
(nodejs/node#53848)
Currently TypeScript does not use the module.exports export type when requiring an ESM file.
I'd like TypeScript to use the module.exports export type for the types when that ESM file is required, aligning the type with the actual runtime object.
What do you want to use this for?
To migrate a package that had CJS files in past, to ESM-only while keeping the interface as-is without generating a separate type definition file.
What shortcomings exist with current approaches?
It requires two type definition types, one for require and one for import, so two builds are needed. The package.json would also be convoluted. main field cannot be used as the type definition file is different for require and import. The exports field would need to be like:
π Search Terms
require(esm), module.exports export, node 22.12
β Viability Checklist
β Suggestion
Node 20.19.0, 22.12.0, 23.0.0 added requiring ESM files (known as
require(esm)
). This feature includesmodule.exports
interop export name feature that allows users to customize what themodule.exports
value would be when a module isrequire
d.(nodejs/node#53848)
Currently TypeScript does not use the
module.exports
export type when requiring an ESM file.I'd like TypeScript to use the
module.exports
export type for the types when that ESM file isrequire
d, aligning the type with the actual runtime object.π Motivating Example
I made a reproduction: https://github.com/sapphi-red-repros/typescript-require-esm-module-exports-export
You can see how the types and the actual runtime values are different by the following steps
pnpm i
pnpm build
) (the built file is already included in the repo)node index.cjs
index.cts
The concrete differences are:
testPkg['module.exports'
isundefined
at runtime, but the type is{ foo: string; default: { bar: string; }; bar: string; }
testPkg
containsbar: string
at runtime, but the type does not include thatnodejs/TSC#1622 (comment) describes the motivation of this
module.exports
export interop feature.π» Use Cases
What do you want to use this for?
To migrate a package that had CJS files in past, to ESM-only while keeping the interface as-is without generating a separate type definition file.
What shortcomings exist with current approaches?
It requires two type definition types, one for
require
and one forimport
, so two builds are needed. The package.json would also be convoluted.main
field cannot be used as the type definition file is different forrequire
andimport
. Theexports
field would need to be like:I haven't considered it yet. Probably I'll use the
exports
field workaround described above.The text was updated successfully, but these errors were encountered: