Microsoft/TypeScript

Generated code when re-exporting a const enum inside a namespace using "preserveConstEnums": true leads to a runtime error

Open

#35,701 opened on 2019年12月16日

GitHub で見る
 (1 comment) (1 reaction) (0 assignees)TypeScript (6,726 forks)batch import
BugDomain: JS EmitHelp Wanted

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (平均マージ 6d 17h) (30d で 9 merged PRs)

説明

TypeScript Version: 3.8.0-dev.20191216

Search Terms: const enum import export preserveConstEnums

Code

MyEnum.ts

const enum MyEnum {
    FirstValue,
    SecondValue
}
export default MyEnum;

ImportExportInNamespace.ts

import _MyEnum from "./MyEnum";
export namespace MyNamespace {
    export import MyEnum = _MyEnum;
}

App.ts

import { MyNamespace } from "./ImportExportInNamespace";
console.log(MyNamespace.MyEnum.FirstValue);

Compile the above using

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "preserveConstEnums": true
  }
}

Expected behavior: ImportExportInNamespace.ts compiles to

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var MyEnum_1 = require("./MyEnum");
var MyNamespace;
(function (MyNamespace) {
    MyNamespace.MyEnum = MyEnum_1.default;
})(MyNamespace = exports.MyNamespace || (exports.MyNamespace = {}));

Actual behavior: ImportExportInNamespace.ts wrongly compiles to

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var MyNamespace;
(function (MyNamespace) {
    MyNamespace.MyEnum = MyEnum_1.default;
})(MyNamespace = exports.MyNamespace || (exports.MyNamespace = {}));

i.e. we are missing

var MyEnum_1 = require("./MyEnum");

If I change the enum not to be a const the code compiles correctly. I'm using it as a workaround.

Related Issues: #23514

コントリビューターガイド