0

我正在尝试使用新的 tsickle/closure 链编译一个角度项目。但是,它似乎必须在所有枚举上遵循错误:

src/path/to/YourEnumType.ts:1: 错误 - 导出必须是模块顶层的语句

我的代码是这样的:

export enum YourEnumType {
    None = 0,
    OneThing = 1,
    OtherThing = 2
}

我该如何处理这个问题?

4

2 回答 2

0

Typescript 编译器从导出的枚举生成:

var YourEnumType;
(function (YourEnumType) {
    YourEnumType[YourEnumType["None"] = 0] = "None";
    YourEnumType[YourEnumType["OneThing"] = 1] = "OneThing";
    YourEnumType[YourEnumType["OtherThing"] = 2] = "OtherThing";
})(YourEnumType = exports.YourEnumType || (exports.YourEnumType = {}));

正如我们所看到的,是的,这个生成的 Javascriptexports在函数内部使用了 from。

深入研究打字稿编译器,尝试使用其生成的输出格式等等,我发现没有办法解决这个问题。尽管如此,如果像我们在这个答案中看到的那样编译这个 Typescript 代码会更好:

var YourEnumType = Object.freeze({"None":1, "OneThing":2, "OtherThing":3, ...});

不幸的是,打字稿不这样做。

谷歌闭包编译器中的类似挖掘表明,如果不修改谷歌闭包源代码,就无法解决这个问题。

因此,考虑到这一点以及整个打字稿世界中枚举的其他主要问题,我认为唯一的出路是避免使用打字稿枚举。

于 2017-11-23T18:15:33.130 回答
0

如果您将其拉到export单独的行,那么它可以工作。IE:

enum YourEnumType {
    None = 0,
    OneThing = 1,
    OtherThing = 2
}
export {YourEnumType};

似乎是 tickle 中的一个错误。

更新:此外,由于您使用了缩小器,因此您应该考虑 const 枚举,它发出的代码更少,并且在与闭包一起使用时具有更少的极端情况:

const enum YourEnumType {
    None = 0,
    OneThing = 1,
    OtherThing = 2
}
export {YourEnumType};
于 2018-06-24T11:38:57.043 回答