Microsoft/TypeScript

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

Open

#35,701 创建于 2019年12月16日

在 GitHub 查看
 (1 评论) (1 反应) (0 负责人)TypeScript (6,726 fork)batch import
BugDomain: JS EmitHelp Wanted

仓库指标

Star
 (48,455 star)
PR 合并指标
 (平均合并 6天 17小时) (30 天内合并 9 个 PR)

描述

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

贡献者指南