循环使用枚举,TypeScript和JQuery

mej*_*eji 8 ienumerable jquery enums enumeration typescript

您好我正在尝试使用TypeScript和JQuery开发一个直接的待办事项应用程序.我有一个列出任务类型的枚举:

export enum TaskType { FrontEnd, BackEnd, Designer };
Run Code Online (Sandbox Code Playgroud)

然而,使用jquery.each或for循环遍历emum,我得到以下结果,(值然后索引):

        FrontEnd, BackEnd, Designer, 0, 1, 2
Run Code Online (Sandbox Code Playgroud)

以下是我通过枚举循环的代码:

        constructor(e?: Object) {             

            var template = this.FormTemplate;

            $(e).append(template);

            var sel = template.find('select');

            /*$.each(TaskType, function (index, el) {
                sel.append("<option value='" + index + "'>" + el + "</option>");
            });*/

            for(var i=0; i < (typeof TaskType).length; i++){
                sel.append("<option value='" + TaskType[i] + "'>" + TaskType[i] + "</option>");
            }

        }
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么会这样?

jfr*_*d00 20

编译为纯JS时,TypeScript枚举包含符号名称和数值作为属性,并解释了FrontEnd, BackEnd, Designer, 0, 1, 2在尝试枚举对象属性时获得的原因.据我所知,没有后编译方式只枚举符号名称.您可以枚举所有这些并跳过任何数字.

本文中,您可以准确地看到TypeScript枚举如何编译成JS.

如果你有这个TypeScript:

//TypeScript declaration:
enum StandardEnum {FirstItem, SecondItem, ThirdItem};
Run Code Online (Sandbox Code Playgroud)

它汇编到这个Javscript:

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

这基本上是这个结果:

var StandardEnum = {
    "FirstItem": 0,
    "SecondItem": 1,
    "ThirdItem": 2,
    "0": "FirstItem",
    "1": "SecondItem",
    "2": "ThirdItem"
};
Run Code Online (Sandbox Code Playgroud)

因此,除非您特别忽略数字属性,否则无法枚举枚举名称.

你可以这样做:

 for (var item in StandardEnum) {
     if (StandardEnum.hasOwnProperty(item) && !/^\d+$/.test(item)) {
         console.log(item);
     }
 }
Run Code Online (Sandbox Code Playgroud)

工作演示:http://jsfiddle.net/jfriend00/65cfg88u/


仅供参考,如果您真正想要的是:

var StandardEnum = {
    "FirstItem": 0,
    "SecondItem": 1,
    "ThirdItem": 2
};
Run Code Online (Sandbox Code Playgroud)

然后,也许你不应该使用枚举,只使用这个标准的JS声明.然后,你可以获得属性Object.keys(StandardEnum).