遍历枚举、TypeScript 和 JQuery
Looping through an enum, TypeScript and JQuery
你好,我正在尝试使用 TypeScript 和 JQuery 开发一个简单的待办事项应用程序。我有一个列出任务类型的枚举:
export enum TaskType { FrontEnd, BackEnd, Designer };
但是使用 jquery.each 或 for 循环遍历 emum,我得到以下结果,(值然后是索引):
FrontEnd, BackEnd, Designer, 0, 1, 2
以下是我循环遍历枚举的代码:
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>");
}
}
谁能告诉我这是为什么?
TypeScript 枚举在编译成纯 JS 时包含符号名称和数值作为属性,这解释了为什么当您尝试枚举对象的属性时得到 FrontEnd, BackEnd, Designer, 0, 1, 2
。据我所知,没有 post-compile 方法来仅枚举符号名称。您可以枚举所有这些并跳过任何数字。
从this article,你可以确切地看到TypeScript枚举是如何编译成JS的。
如果你有这个 TypeScript:
//TypeScript declaration:
enum StandardEnum {FirstItem, SecondItem, ThirdItem};
它编译成这个 Javscript:
//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);
}
}
工作演示:http://jsfiddle.net/jfriend00/65cfg88u/
仅供参考,如果您真正想要的是:
var StandardEnum = {
"FirstItem": 0,
"SecondItem": 1,
"ThirdItem": 2
};
那么,也许你不应该使用枚举而只使用这个标准的 JS 声明。然后,您可以使用 Object.keys(StandardEnum)
.
获取属性
你好,我正在尝试使用 TypeScript 和 JQuery 开发一个简单的待办事项应用程序。我有一个列出任务类型的枚举:
export enum TaskType { FrontEnd, BackEnd, Designer };
但是使用 jquery.each 或 for 循环遍历 emum,我得到以下结果,(值然后是索引):
FrontEnd, BackEnd, Designer, 0, 1, 2
以下是我循环遍历枚举的代码:
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>");
}
}
谁能告诉我这是为什么?
TypeScript 枚举在编译成纯 JS 时包含符号名称和数值作为属性,这解释了为什么当您尝试枚举对象的属性时得到 FrontEnd, BackEnd, Designer, 0, 1, 2
。据我所知,没有 post-compile 方法来仅枚举符号名称。您可以枚举所有这些并跳过任何数字。
从this article,你可以确切地看到TypeScript枚举是如何编译成JS的。
如果你有这个 TypeScript:
//TypeScript declaration:
enum StandardEnum {FirstItem, SecondItem, ThirdItem};
它编译成这个 Javscript:
//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);
}
}
工作演示:http://jsfiddle.net/jfriend00/65cfg88u/
仅供参考,如果您真正想要的是:
var StandardEnum = {
"FirstItem": 0,
"SecondItem": 1,
"ThirdItem": 2
};
那么,也许你不应该使用枚举而只使用这个标准的 JS 声明。然后,您可以使用 Object.keys(StandardEnum)
.