2015-06-04 19 views
7

Witaj im próbuje t opracować proste todo aplikację używając maszynopis i jQuery. Mam enum, który zawiera listę typów zadań:Przelotowe wyliczenia, maszynopis i JQuery

export enum TaskType { FrontEnd, BackEnd, Designer }; 

Jednak pętli przez emum użyciu jQuery.each lub pętli, pojawia się następujący wynik, następnie indeksuje (wartości):

 FrontEnd, BackEnd, Designer, 0, 1, 2 

Poniższy to kod i pętla w wyliczeniu:

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

     } 

Czy ktoś może mi powiedzieć, dlaczego tak jest?

Odpowiedz

18

Wyliczenia TypeScript po kompilacji w prosty JS zawierają zarówno symboliczną nazwę ORAZ wartości liczbowe jako właściwości, jak i wyjaśnia, dlaczego otrzymujesz FrontEnd, BackEnd, Designer, 0, 1, 2 podczas próby wyliczenia właściwości obiektu. Jak najlepiej wiem, nie ma post-kompilacyjnego sposobu na wyliczenie tylko symbolicznych nazw. Możesz wyliczyć wszystkie z nich i pominąć wszystko, co jest liczbą.

Od this article można dokładnie zobaczyć, w jaki sposób wyliczenia maszynopis kompiluje w JS.

Jeśli masz ten maszynopis:

//TypeScript declaration: 
enum StandardEnum {FirstItem, SecondItem, ThirdItem}; 

kompiluje do tego javscript:

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

który jest zasadniczo ten wynik:

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

Więc, chyba że wyraźnie ignorują właściwości numeryczne, nie ma sposobu na wyliczenie tylko nazw wyliczeniowych.

Można to zrobić tak:

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

demo robocza: http://jsfiddle.net/jfriend00/65cfg88u/


FYI, jeśli to, co naprawdę chcesz to:

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

Wtedy, być może powinieneś nie używać wyliczenia i po prostu użyć tej standardowej deklaracji JS. Następnie możesz uzyskać właściwości za pomocą Object.keys(StandardEnum).

+0

Dzięki za wyjaśnienie, ale nie byłoby sensu, aby powrócić go jako klucz: wartość przedmiotu ?, to jest duży zawieść, i tak skończyło się przy użyciu: if (! TaskType [i] == niezdefiniowany) w za pętli, ponieważ zwraca wartości, a następnie niezdefiniowane wartości. – meji

+1

@meji - możesz zwrócić, co chcesz - właśnie pokazałem ci, jak możesz zidentyfikować tylko nazwane właściwości. FYI, może powinieneś po prostu zdefiniować obiekt JS z właściwościami, a nie wyliczeniem, jeśli tego chcesz. – jfriend00

+0

Dlaczego upadek? Jak ta odpowiedź jest błędna? – jfriend00