有没有办法在打字稿中创建环境中的枚举?

时间:2013-04-05 18:56:57

标签: enums typescript

在打字稿0.9之后编辑:现在支持枚举:

enum Select { every, first, last }

原始问题:

这里讨论了打字稿中的枚举,但没有解决办法导致环境设计。环境枚举定义意味着枚举仅由编译器处理,而编译的js输出文件仅处理原始数值。就像在C ++ 11中一样。

我最接近的是

declare var Color = { red: 1, blue: 2, green: 3 } // DOES NOT COMPILE

但是编译器不接受这个:“Ambient变量不能有初始化器”。

修改
结合dmck的答案:

declare var Color: { Red: number; Green: number; Blue: number; };

这不会输出任何js代码。换句话说,它是环境。然而,这也使它无用:

declare var Color: { Red: number; Green: number; Blue: number; };

function test() {
  var x = Color.Blue;    // null ref exception, no Color object
  console.log(x == Color.Red);
}

将产生运行时错误,因为未在js中定义Color。 ts声明只是声称js中有一些Color对象,而事实上,没有定义,没有。我解决了这个问题,我们可以添加

var Color = {
   Red: 1,
   Green: 2,
   Blue: 3
};

但是现在enum实现不是“环境”,因为typescript编译器执行C ++编译器所做的事情,将所有出现的枚举值减少为普通数字。 当前的环境声明允许进行类型检查,但不允许进行此类替换。

3 个答案:

答案 0 :(得分:4)

TypeScript 0.9允许这样:

declare module A { export enum E { X, Y, Z } }

答案 1 :(得分:2)

添加答案,因为有从TypeScript 1.4开始的新功能;

使用const enum给出预期结果。

这是一个正常的枚举:

//TypeScript:
enum StandardEnum {FirstItem, SecondItem, ThirdItem};

//Compiled javascript:
var StandardEnum;
(function (StandardEnum) {
    StandardEnum[StandardEnum["FirstItem"] = 0] = "FirstItem";
    StandardEnum[StandardEnum["SecondItem"] = 1] = "SecondItem";
    StandardEnum[StandardEnum["ThirdItem"] = 2] = "ThirdItem";
})(StandardEnum || (StandardEnum = {}));

这是一个const enum:

//TypeScript:
const enum ConstantEnum { FirstItem, SecondItem, ThirdItem };

//Compiled javascript:
;

此博文详细解释了它:https://tusksoft.com/blog/posts/11/const-enums-in-typescript-1-4-and-how-they-differ-from-standard-enums

答案 2 :(得分:1)

你可以这样做:

declare var Color: { Red: number; Green: number; Blue: number; };

请记住,通过设计 环境声明对代码输出 没有影响。所以某处你需要实际声明Color和每个枚举成员的值。