microsoft / microsoft/TypeScript
Cannot export both types and values from CJS
@andrewbranch is already working on this.
Since Jan 3, 2025.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
🔎 Search Terms
verbatimModuleSyntax, commonjs, require, export, export type,
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about CJS export syntax and verbatimModuleSyntax release notes.
⏯ Playground Link
💻 Code
I wanted to convert a *.ts file that gets interpreted as CJS (due to package.json "type" field) to use verbatimModuleSyntax for explicitness.
The file previously looked like this
// index.ts
export type Foo = string | number;
export const Bar = 42;
and could be imported like so
// foo.ts
import { type Foo, Bar } from './index';
const x: Foo = 42;
const y = Bar;
After enabling verbatimModuleSyntax, it seems no longer possible to export both Foo and Bar from index.ts. Some attempts:
type Foo = string | number;
const Bar = 42;
export = { Foo, Bar }; // error; Foo is a type but used as a value
This is ok,
export type Foo = string | number;
const Bar = 42;
but this is not
export type Foo = string | number;
const Bar = 42;
export = { Bar }; // An export assignment cannot be used in a module with other exported elements. (TS2309)
nor this
type Foo = string | number;
const Bar = 42;
export type { Foo };
export = { Bar }; // An export assignment cannot be used in a module with other exported elements. (TS2309)
tsconfig:
{
"compilerOptions": {
"verbatimModuleSyntax": true,
"target": "ESNext",
"module": "NodeNext",
"strict": true,
}
}
package.json: has "type": "commonjs"
🙁 Actual behavior
Can't find a way to export both types and values using CJS import/export syntax required by verbatimModuleSyntax
🙂 Expected behavior
There is a way to export both types and values using CJS import/export syntax
Additional information about the issue
Perhaps this is possible, and if so I'd ask it be added to the documentation. Without this, a currently-functioning CJS module cannot straightforwardly be converted to use verbatimModuleSyntax.
FWIW, if it's not possible, I don't see why at least one of the following wouldn't be allowed (specifically due to the use of export type to ensure only one value export exists)
export type Foo = string | number;
const Bar = 42;
export = { Bar }; // not a problem; only one value export
or
type Foo = string | number;
const Bar = 42;
export type { Foo };
export = { Bar };
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.