Skip to content

TypeError when overriding export entries in star export #38820

Closed
@legendecas

Description

@legendecas

TypeScript Version: 3.9.3

Search Terms: export star, export binding, duplicated exports

Code

// a.ts
export const name = 'a'
// b.ts
export const name = 'b'
// c.ts
export * from './a'
export { name } from './b'
// d.ts
import { name } from './c'
console.log(name) 

Expected behavior:

In d.ts, it should print b.

Tested with pure .mjs with Node.js, it works as expected.

Actual behavior:

Throws TypeError: Cannot redefine property: name

Generates:

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
};
exports.__esModule = true;
__exportStar(require("./a"), exports);
var b_1 = require("./b");
__createBinding(exports, b_1, "name");

Also tested on TypeScript 3.8.3, 3.8.3 generates:

function __export(m) {
    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
exports.__esModule = true;
__export(require("./a"));
var b_1 = require("./b");
exports.name = b_1.name;

According to https://tc39.es/ecma262/#sec-resolveexport, the star exports should be resolved after explicit export names.

Metadata

Metadata

Assignees

Labels

Needs InvestigationThis issue needs a team member to investigate its status.

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions