4

在 typescript 0.9 发布后编辑:现在支持枚举:

enum Select { every, first, last }

原始问题:

此处讨论了 typescript 中的枚举,但没有解决方案导致环境设计。环境枚举定义意味着枚举仅由编译器处理,编译后的 js 输出文件仅处理原始数值。就像在 C++11 中一样。

我得到的最接近的是

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

但编译器不接受这一点:“环境变量不能有初始化程序”。

编辑
合并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 中定义。ts 声明只是声称 js 中有一些 Color 对象,而实际上,没有定义,就没有。Ti 修复这个我们可以添加

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

但是现在枚举实现不是“环境”的,因为打字稿编译器做了 C++ 编译器所做的事情,将所有出现的枚举值减少为纯数字。当前的环境声明允许类型检查,但不允许替换。

4

3 回答 3

4

TypeScript 0.9 允许这样做:

declare module A { export enum E { X, Y, Z } }
于 2013-06-29T15:41:28.507 回答
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 = {}));

这是一个常量枚举:

//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

于 2017-03-20T12:49:51.057 回答
1

你可以这样做:

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

请记住,设计环境声明对代码的输出没有影响。因此,您需要在某个地方实际声明 Color 和每个枚举成员的值。

于 2013-04-05T20:59:40.203 回答