循环遍历枚举、TypeScript和JQuery

循环遍历枚举、TypeScript和JQuery,jquery,enums,typescript,ienumerable,enumeration,Jquery,Enums,Typescript,Ienumerable,Enumeration,您好,我正在尝试使用TypeScript和JQuery开发一个简单的todo应用程序。我有一个列出任务类型的枚举: export enum TaskType { FrontEnd, BackEnd, Designer }; 但是,使用jquery.each或for循环遍历emum时,我会得到以下结果、值和索引: FrontEnd, BackEnd, Designer, 0, 1, 2 以下是通过枚举的代码i循环: constructor(e?: Object)

您好,我正在尝试使用TypeScript和JQuery开发一个简单的todo应用程序。我有一个列出任务类型的枚举:

export enum TaskType { FrontEnd, BackEnd, Designer };
但是,使用jquery.each或for循环遍历emum时,我会得到以下结果、值和索引:

        FrontEnd, BackEnd, Designer, 0, 1, 2
以下是通过枚举的代码i循环:

        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>");
            }

        }

有人能告诉我这是为什么吗?

当编译成纯JS时,TypeScript枚举同时包含符号名和数值作为属性,这解释了为什么在尝试枚举对象的属性时,会得到前端、后端、设计器、0、1、2。据我所知,在编译后没有只枚举符号名的方法。你可以列举所有的数字,跳过任何数字

从中,您可以确切地看到TypeScript枚举如何编译成JS

如果您有此类型脚本:

//TypeScript declaration:
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 = {}));
;
这基本上就是这个结果:

var StandardEnum = {
    "FirstItem": 0,
    "SecondItem": 1,
    "ThirdItem": 2,
    "0": "FirstItem",
    "1": "SecondItem",
    "2": "ThirdItem"
};
因此,除非您特别忽略数值属性,否则无法仅枚举枚举名称

你可以这样做:

 for (var item in StandardEnum) {
     if (StandardEnum.hasOwnProperty(item) && !/^\d+$/.test(item)) {
         console.log(item);
     }
 }
工作演示:

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

var StandardEnum = {
    "FirstItem": 0,
    "SecondItem": 1,
    "ThirdItem": 2
};

那么,也许您不应该使用enum,而应该使用这个标准的JS声明。然后,您可以使用Object.keysStandardEnum获取属性。

谢谢您的解释,但是将其作为key:value对象返回是否有意义?这是一个很大的失望,无论如何,我最终使用了:ifTaskType[i]!==for循环中未定义,因为它返回值,然后返回未定义的值。@meji-您可以返回任何您想要的-我只是向您展示了如何仅识别命名属性。仅供参考,如果你想要的话,也许你应该用属性而不是枚举来定义一个JS对象。这也适用于typescript@2?@k0pernikus-我没有任何理由相信它在TS2.0中发生了变化,但是在这方面没有明确检查TS2.0输出。@mightyiam-这可能适用于此特定情况,但由于特殊情况,它可能取决于枚举值是什么。我不喜欢依赖自动类型强制,isNan的强制规则非常复杂。可能重复