2015-06-04 9 views
7

Hallo ich versuche, eine direkte Todo-App mit TypeScript und JQuery zu entwickeln. Ich habe eine Enumeration, die Aufgabentypen aufgelistet:Schleifen durch ein Enum, TypeScript und JQuery

export enum TaskType { FrontEnd, BackEnd, Designer }; 

jedoch Schleifen der emum mit jquery.each oder for-Schleife, erhalte ich das folgende Ergebnis (Werte dann Indizes):

 FrontEnd, BackEnd, Designer, 0, 1, 2 

Die folgende ist der code ich schleife durch die enum:

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

     } 

Kann mir jemand sagen, warum das ist?

Antwort

18

TypeScript-Aufzählungen, wenn sie in plain JS kompiliert werden, enthalten sowohl den symbolischen Namen UND die numerischen Werte als Eigenschaften und erklären, warum Sie FrontEnd, BackEnd, Designer, 0, 1, 2 erhalten, wenn Sie versuchen, die Eigenschaften des Objekts aufzuzählen. Wie ich am besten weiß, gibt es keine Möglichkeit, nach dem Kompilieren nur die symbolischen Namen aufzulisten. Sie könnten alle aufzählen und alles überspringen, was eine Nummer ist.

Von this article können Sie genau sehen, wie ein TypeScript Enum in JS kompiliert.

Wenn Sie dieses Typoskript:

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

Es kompiliert zu diesem Javscript:

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

, die im Wesentlichen das Ergebnis ist:

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

Also, wenn Sie die speziell ignorieren Bei numerischen Eigenschaften gibt es keine Möglichkeit, nur die Enum-Namen aufzulisten.

Sie könnten das tun wie folgt aus:

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

Arbeits Demo: http://jsfiddle.net/jfriend00/65cfg88u/


FYI, wenn das, was Sie wirklich wollen:

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

Dann sollten Sie vielleicht Verwenden Sie nicht die Enumeration und verwenden Sie einfach diese Standard-JS-Deklaration. Dann könnten Sie die Eigenschaften mit Object.keys(StandardEnum) erhalten.

+0

Danke für die Erklärung aber wäre es nicht sinnvoll, es als Schlüssel zurückzugeben: Wertobjekt ?, das ist eine große Enttäuschung, trotzdem habe ich am Ende mit: if (TaskType [i]! == undefined) in für Schleife, da es Werte und dann undefinierte Werte zurückgibt. – meji

+1

@meji - Sie können zurückgeben, was Sie wollen - ich zeigte Ihnen nur, wie Sie nur die genannten Eigenschaften identifizieren können. Zu Ihrer Information, vielleicht sollten Sie ein JS-Objekt nur mit Eigenschaften statt einer Aufzählung definieren, wenn es das ist, was Sie wollen. – jfriend00

+0

Warum der Downvote? Wie ist diese Antwort falsch? – jfriend00

Verwandte Themen