Цикл по перечислению, TypeScript и JQuery

Здравствуйте, я пытаюсь разработать простое приложение для задач с использованием TypeScript и JQuery. У меня есть перечисление, в котором перечислены типы задач:

export enum TaskType { FrontEnd, BackEnd, Designer };

Однако, перебирая emum с помощью jquery.each или цикла for, я получаю следующий результат (значения затем индексируются):

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

        }

Может кто-нибудь сказать мне, почему это так?


person meji    schedule 04.06.2015    source источник
comment
Возможный дубликат Как получить имена перечисления TypeScript записи?   -  person jjbskir    schedule 04.04.2019


Ответы (1)


Перечисления TypeScript при компиляции в простой JS содержат как символьное имя, так и числовые значения в качестве свойств, и это объясняет, почему вы получаете FrontEnd, BackEnd, Designer, 0, 1, 2, когда пытаетесь перечислить свойства объекта. Насколько мне известно, нет способа после компиляции перечислить только символические имена. Вы можете перечислить их все и пропустить все, что является числом.

Из этой статьи, вы можете точно увидеть, как перечисление 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).

person jfriend00    schedule 04.06.2015
comment
Спасибо за объяснение, но не имеет ли смысла возвращать его как объект key: value ?, это большое разочарование, в любом случае я в конечном итоге использовал: if (TaskType [i]! == undefined) в цикле for, поскольку он возвращает значения, а затем неопределенные значения. - person meji; 05.06.2015
comment
@meji - вы можете вернуть все, что захотите - я просто показал вам, как вы можете идентифицировать только названные свойства. К вашему сведению, возможно, вам следует просто определить объект JS со свойствами, а не перечислением, если вы хотите, чтобы он был таким. - person jfriend00; 05.06.2015
comment
Применимо ли это также к машинописному тексту @ 2? - person k0pernikus; 09.01.2017
comment
@ k0pernikus - У меня нет никаких оснований полагать, что в TS2.0 он изменился, но я не исследовал явно вывод TS2.0 на этот счет. - person jfriend00; 09.01.2017
comment
Как насчет чего-то вроде Object.values(myEnum).filter(isNaN), чтобы получить массив нечисловых значений? - person mightyiam; 25.03.2017
comment
@mightyiam - возможно, это сработает для этого конкретного случая, но это может зависеть от того, какие значения перечисления были из-за особых случаев. Мне не нравится полагаться на автоматическое приведение типов, а правила приведения для isNan() довольно сложные см. Здесь. - person jfriend00; 26.03.2017