microsoft / microsoft/TypeScript
Generated code when re-exporting a const enum inside a namespace using "preserveConstEnums": true leads to a runtime error
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
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 de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez le problème avec MyEnum.ts, ImportExportInNamespace.ts et App.ts en utilisant les cibles es5, commonjs et preserveConstEnums. Commencez par suivre la sortie produite par le compilateur pour l’exportation-importation du namespace, puis comparez-la avec la sortie attendue de ImportExportInNamespace.js. C’est terminé lorsque le fichier généré inclut la liaison require("./MyEnum") et que l’exemple à l’exécution ne génère plus d’erreur.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript, typescript
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 42/100