繁体   English   中英

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

[英]Is there a way to create enums in typescript that are ambient?

在打印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对象,而事实上,没有定义,没有。 我们可以添加Ti解决这个问题

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

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

TypeScript 0.9允许这样:

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

添加答案,因为有从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

你可以这样做:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM