Microsoft/TypeScript

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

Open

#35 701 ouverte le 16 déc. 2019

Voir sur GitHub
 (1 commentaire) (1 réaction) (0 assignés)TypeScript (6 726 forks)batch import
BugDomain: JS EmitHelp Wanted

Métriques du dépôt

Stars
 (48 455 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (9 PRs mergées en 30 j)

Description

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

Guide contributeur