Closed
Description
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.