【问题标题】:Is there a way to create enums in typescript that are ambient?有没有办法在打字稿中创建环境枚举?
【发布时间】:2013-04-05 18:56:56
【问题描述】:

在 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++ 编译器所做的事情,将所有出现的枚举值减少为纯数字。 当前的环境声明允许类型检查,但不允许替换。

【问题讨论】:

    标签: enums typescript


    【解决方案1】:

    TypeScript 0.9 允许这样做:

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

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

        你可以这样做:

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

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

        【讨论】:

          猜你喜欢
          • 2015-03-17
          • 1970-01-01
          • 2020-10-27
          • 1970-01-01
          • 2020-04-30
          • 2021-06-26
          • 2021-11-05
          • 2021-08-10
          • 1970-01-01
          相关资源
          最近更新 更多