टाइपस्क्रिप्ट में टाइप की तरह एनम कैसे बनाएं?


120

मैं टाइपस्क्रिप्ट के लिए Google मानचित्र API के लिए एक परिभाषा फ़ाइल पर काम कर रहा हूं।

और मुझे एक एनुम को टाइप करने के लिए परिभाषित करने की आवश्यकता है जैसे। google.maps.Animationजिसमें दो गुण होते हैं: BOUNCEऔर DROP

यह टाइपस्क्रिप्ट में कैसे किया जाना चाहिए?


3
Google मैप्स v3 की परिभाषा अब पूरी हो चुकी है और इसे Github और NuGet
eNepper

जवाबों:


140

टाइपस्क्रिप्ट 0.9+ में एनम के लिए एक विनिर्देशन है:

enum AnimationType {
    BOUNCE,
    DROP,
}

अंतिम अल्पविराम वैकल्पिक है।


11
मैं enumइस स्तर पर निर्माण का उपयोग करने के खिलाफ सलाह दूंगा क्योंकि टाइपस्क्रिप्ट टीम ने यह स्पष्ट कर दिया है कि यह बदलने जा रहा है - इसलिए यह टूट जाएगा।
फेंटन

1
कृपया अपने आप को एडिटिंग टूल के साथ सहज बनाएं, उदाहरण के लिए कोड के साथ आप अपने उत्तर को जोड़ते हैं। मैंने इसे आपके उत्तर में बदल दिया, कृपया देख लें। कृपया उस भाषा सुविधा के बारे में संबंधित चर्चा होने पर कुछ संदर्भ छोड़ दें।
10

enum एनिमेशन {BOUNCE = 1, DROP}, चूंकि मैप्स एपीआई उन्हें परिभाषित करता है।
destest


एनम और इसके सदस्य नामकरण परंपराएं सी # में समान हैं। (दोनों Microsoft से)। यह PascalCase है। UPPER_CASE नहीं।
डोमिनिक

66

TypeScript 0.9 (वर्तमान में एक अल्फा रिलीज) के रूप में आप इस तरह से एनम परिभाषा का उपयोग कर सकते हैं:

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

डिफ़ॉल्ट रूप से, इन गणनाओं को क्रमशः 0, 1 और 2 सौंपा जाएगा। यदि आप इन संख्याओं को स्पष्ट रूप से निर्धारित करना चाहते हैं, तो आप एनम घोषणा के भाग के रूप में ऐसा कर सकते हैं।

सुस्पष्ट सदस्यों के साथ 6.2 गणना

enum TShirtSize {
  Small = 3,
  Medium = 5,
  Large = 8
}

var mySize = TShirtSize.Large;

इन दोनों उदाहरणों को जावास्क्रिप्ट प्रोग्रामर के लिए सीधे टाइपस्क्रिप्ट से हटा दिया गया ।

ध्यान दें कि यह 0.8 विनिर्देशन के लिए अलग है। 0.8 विनिर्देशन इस तरह दिखता था - लेकिन इसे प्रायोगिक और परिवर्तन की संभावना के रूप में चिह्नित किया गया था, इसलिए आपको किसी भी पुराने कोड को अपडेट करना होगा:

अस्वीकरण - यह 0.8 उदाहरण टाइपस्क्रिप्ट कंपाइलर के नए संस्करणों में टूट जाएगा।

enum TShirtSize {
  Small: 3,
  Medium: 5,
  Large: 8
}

var mySize = TShirtSize.Large;

3
यह अब स्वीकृत जवाब होना चाहिए क्योंकि यह अभी भी आरसी में काम कर रहा है और इसलिए टीएस के भविष्य के संस्करणों के साथ टूटने की संभावना नहीं है।
एड्रियन ग्रिगोर

24

यह अब भाषा का हिस्सा है। इस पर प्रलेखन के लिए TypeScriptLang.org> बुनियादी प्रकार> enum देखें । इन एनमों का उपयोग करने के बारे में दस्तावेज़ीकरण का एक अंश:

enum Color {Red, Green, Blue};
var c: Color = Color.Green;

या मैनुअल बैकिंग नंबरों के साथ:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;

आप उदाहरण के लिए उपयोग करके एनम नाम पर वापस जा सकते हैं Color[2]

यहाँ एक उदाहरण है कि यह सब एक साथ कैसे होता है:

module myModule {
    export enum Color {Red, Green, Blue};

    export class MyClass {
        myColor: Color;

        constructor() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
    }
}

var foo = new myModule.MyClass();

यह लॉग करेगा:

undefined  
2  
Blue

क्योंकि, यह लिखते समय, टाइपस्क्रिप्ट प्लेग्राउंड इस कोड को उत्पन्न करेगा:

var myModule;
(function (myModule) {
    (function (Color) {
        Color[Color["Red"] = 0] = "Red";
        Color[Color["Green"] = 1] = "Green";
        Color[Color["Blue"] = 2] = "Blue";
    })(myModule.Color || (myModule.Color = {}));
    var Color = myModule.Color;
    ;
    var MyClass = (function () {
        function MyClass() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
        return MyClass;
    })();
    myModule.MyClass = MyClass;
})(myModule || (myModule = {}));
var foo = new myModule.MyClass();

14

बस एक और नोट कि आप निम्नलिखित के साथ एक आईडी / स्ट्रिंग एनम कर सकते हैं:

class EnumyObjects{
    public static BOUNCE={str:"Bounce",id:1};
    public static DROP={str:"Drop",id:2};
    public static FALL={str:"Fall",id:3};


}

2
आप उनकी strऔर idउस का उपयोग कैसे कर पाएंगे ?
kba

1
EnumyObjects.BOUNCE.str मान तक पहुँच जाएगा।
किया_मरसन

2
इस डिज़ाइन के साथ समस्या यह है कि ऑब्जेक्ट सभी उत्परिवर्तनीय हैं, जो समस्याएं पैदा कर सकते हैं: goo.gl/CT4Ip
Fenton

abstract classटाइप करने से रोकने के लिए अधिक उपयुक्त होगा क्योंकि टाइपस्क्रिप्ट में एक की धारणा नहीं है static class?
जॉक्ल

10

अपडेट :

जैसा कि @ iX3 द्वारा उल्लेख किया गया है, टाइपस्क्रिप्ट 2.4 में एनम स्ट्रिंग्स के लिए समर्थन है।

देखें: टाइपस्क्रिप्ट में स्ट्रिंग मानों के साथ एक एनम बनाएं


मूल उत्तर:

स्ट्रिंग सदस्य मानों के लिए, टाइपस्क्रिप्ट केवल संख्या सदस्य मानों की अनुमति देता है। लेकिन कुछ समाधान / हैक हैं जिन्हें आप लागू कर सकते हैं;

समाधान 1:

से कॉपी किया गया: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/

एक सरल समाधान है: बस असाइन करने से पहले किसी भी स्ट्रिंग शाब्दिक कास्ट करें:

export enum Language {
    English = <any>"English",
    German = <any>"German",
    French = <any>"French",
    Italian = <any>"Italian"
}

समाधान 2:

से कॉपी किया गया: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

आप एक स्ट्रिंग शाब्दिक का उपयोग एक प्रकार के रूप में कर सकते हैं। उदाहरण के लिए:

let foo: 'Hello';

यहाँ हमने foo नामक एक वैरिएबल बनाया है जो केवल शाब्दिक मान 'हैलो' को ही असाइन करने की अनुमति देगा। यह नीचे प्रदर्शित किया गया है:

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"

वे अपने आप में बहुत उपयोगी नहीं हैं लेकिन एक शक्तिशाली (और उपयोगी) अमूर्त बनाने के लिए एक प्रकार के संघ में जोड़ा जा सकता है जैसे:

type CardinalDirection =
    "North"
    | "East"
    | "South"
    | "West";

function move(distance: number, direction: CardinalDirection) {
    // ...
}

move(1,"North"); // Okay
move(1,"Nurth"); // Error!

1
टाइपस्क्रिप्ट 2.4 में एनम में स्ट्रिंग शाब्दिक प्रकार के लिए समर्थन शामिल है। देखें stackoverflow.com/questions/15490560/... और blogs.msdn.microsoft.com/typescript/2017/06/27/...
iX3

1

टाइपस्क्रिप्ट में Enums:

Enums नाम टाइप के एक सेट को परिभाषित करने के लिए टाइपस्क्रिप्ट भाषा में रखा जाता है। एनम का उपयोग करना हमारे जीवन को आसान बना सकता है। इसका कारण यह है कि ये स्थिरांक अक्सर उस मूल्य की तुलना में पढ़ने में आसान होते हैं जो कि एनम प्रतिनिधित्व करता है।

एक एनम बनाना:

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

टाइपस्क्रिप्ट डॉक्स से यह उदाहरण बहुत अच्छी तरह से बताता है कि कैसे काम करता है। ध्यान दें कि हमारा पहला एनम वैल्यू (अप) 1 से शुरू होता है। एनम के सभी निम्नलिखित सदस्य इस मूल्य से ऑटो इंक्रीमेंट किए जाते हैं (यानी डाउन = 2, लेफ्ट = 3, राइट = 4)। यदि हमने 1 के साथ पहले मान को इनिशियलाइज़ नहीं किया है तो एनम 0 पर शुरू होगा और फिर ऑटो इंक्रीमेंट (यानी डाउन = 1, लेफ्ट = 2, राइट = 3)।

एक एनम का उपयोग करना:

हम निम्नलिखित तरीके से एनम के मूल्यों तक पहुँच सकते हैं:

Direction.Up;     // first the enum name, then the dot operator followed by the enum value
Direction.Down;

ध्यान दें कि इस तरह से हम अपने कोड लिखने के तरीके में बहुत अधिक वर्णनात्मक हैं । एनम मूल रूप से हमें जादू की संख्या (संख्या जो किसी इकाई का प्रतिनिधित्व करते हैं क्योंकि प्रोग्रामर ने उन्हें एक निश्चित संदर्भ में एक अर्थ दिया है) का उपयोग करने से रोकते हैं । निम्नलिखित कारणों से मैजिक नंबर खराब हैं:

  1. हमें और अधिक सोचने की आवश्यकता है, पहले हमें अपने कोड के बारे में तर्क करने से पहले नंबर को एक इकाई में अनुवाद करना होगा।
  2. यदि हम लंबे समय के बाद अपने कोड की समीक्षा करते हैं, या अन्य प्रोग्रामर हमारे कोड की समीक्षा करते हैं, तो वे जरूरी नहीं जानते कि इन नंबरों का क्या मतलब है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.