microsoft / microsoft/TypeScript

The module namespace object returned by __importStar is not the same when import the same module multiple times

Open
#63,391 2 comments 1 reaction 0 assignees View on GitHub
Bug Domain: JS Emit
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

### 🔎 Search Terms

- `__importStar`
- `module object`
- `namespace object`

### 🕗 Version & Regression Information

- Version: 6.0.2
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about "namespace import". I did not found any information related to this.

### ⏯ Playground Link

https://www.typescriptlang.org/play/?target=99&jsx=0&module=1&ts=6.0.2#code/DYUwLgBADgjBC8ECWBbKB7ATmAFAIgDMBnPASgG4BYAKFEigCYFk0tdCSKaaAFTdFEiIgAdAENgwHAG1YAGmgMAuqRFgAFiAB2OGcRgLiy0ggB8EAN40INiAGN0WoulAjg6AOY59CeIiMUEAD0QRBgmACuIDQAvlzUQA

### 💻 Code

```ts
let p1 = import("fs");
let p2 = import("fs");

Promise.all([p1, p2]).then(([fs1, fs2]) => {
console.log(fs1 === fs2); // expected true
});
```

### 🙁 Actual behavior

When the compiled code with node is run, `false` is printed. This means that the two imported module namespace object is different. each `__importStar` call create a new module namespace object.

### 🙂 Expected behavior

`true` should be printed. The module namespace objects of these two `import("fs")` should be the same object.
If we run this script directly by `node` without compiled, `true` will be printed.

### Additional information about the issue

To reproduce this issue, "module" in "tsconfig.json" need to be set to "commonjs". This makes `tsc` use `__importStar` and `require` to import the module.

Contributor guide

Open the contributing guide

Research direction

Start with the __importStar helper and the CommonJS module path described in the issue, using the linked Playground example and a Node.js run as the reproduction. Compare the two Promise results and trace how repeated import("fs") calls create namespace objects; done means the compiled CommonJS case matches direct Node.js behavior and returns the same object.

Written by the indexing model from the issue text.

Assessment

Tech stack
node.js, typescript
Domain
build-system, compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.