javascript - ईएस 6 के साथ जावास्क्रिप्ट में एनम




enums ecmascript-6 (7)

मैं जावास्क्रिप्ट में एक पुराने जावा प्रोजेक्ट का पुनर्निर्माण कर रहा हूं, और महसूस किया कि जेएस में एनम करने का कोई अच्छा तरीका नहीं है।

सबसे अच्छा मैं आ सकता है:

const Colors = {
    RED: Symbol("red"),
    BLUE: Symbol("blue"),
    GREEN: Symbol("green")
};
Object.freeze(Colors);

यह const Colors को आश्वस्त करता है, और इसे फ्रीज करने से कुंजियों और मूल्यों को बदलने से रोकता है। मैं Symbols का उपयोग कर रहा हूं ताकि Colors.RED 0 बराबर न हो, या इसके अलावा कुछ और न हो।

इस सूत्रीकरण के साथ कोई समस्या है? क्या कोई बेहतर तरीका है?

(मुझे पता है कि यह सवाल थोड़ा दोहराने वाला है, लेकिन सभी पिछले क्यू / जैसा कि काफी पुराना है, और ईएस 6 हमें कुछ महत्वपूर्ण क्षमताएं प्रदान करता है।)

संपादित करें:

एक अन्य समाधान, जो क्रमबद्धता की समस्या से निपटता है, लेकिन मेरा मानना ​​है कि अभी भी दायरे में समस्याएँ हैं:

const enumValue = (name) => Object.freeze({toString: () => name});

const Colors = Object.freeze({
    RED: enumValue("Colors.RED"),
    BLUE: enumValue("Colors.BLUE"),
    GREEN: enumValue("Colors.GREEN")
});

मान संदर्भों के रूप में ऑब्जेक्ट संदर्भों का उपयोग करके, आपको समान टकराव-परिहार मिलता है जैसा कि प्रतीक।


इस सूत्रीकरण के साथ कोई समस्या है?

मुझे कोई दिखाई नहीं देता।

क्या कोई बेहतर तरीका है?

मैं दो कथनों को एक में समेटूँगा:

const Colors = Object.freeze({
    RED:   Symbol("red"),
    BLUE:  Symbol("blue"),
    GREEN: Symbol("green")
});

यदि आप बॉयलरप्लेट को पसंद नहीं करते हैं, तो बार-बार Symbol कॉल की तरह, आप निश्चित रूप से एक सहायक फ़ंक्शन makeEnum भी लिख सकते हैं जो नामों की सूची से एक ही चीज़ बनाता है।


आप Enumify जाँच कर सकते हैं, ES6 Enumify के लिए एक बहुत अच्छी और अच्छी तरह से चित्रित पुस्तकालय।


आप es6-enum पैकेज ( https://www.npmjs.com/package/es6-enum ) का भी उपयोग कर सकते हैं। इसका उपयोग करना बहुत आसान है। नीचे उदाहरण देखें


जबकि Symbol रूप में Enum मान का उपयोग साधारण उपयोग के मामलों के लिए ठीक काम करता है, यह Enums को गुण देने के लिए आसान हो सकता है। यह गुण युक्त एनम मान के रूप में किसी Object का उपयोग करके किया जा सकता है।

उदाहरण के लिए हम प्रत्येक Colors एक नाम और हेक्स मान दे सकते हैं:

/**
 * Enum for common colors.
 * @readonly
 * @enum {{name: string, hex: string}}
 */
const Colors = Object.freeze({
  RED:   { name: "red", hex: "#f00" },
  BLUE:  { name: "blue", hex: "#00f" },
  GREEN: { name: "green", hex: "#0f0" }
});

Enum में गुणों को शामिल करने से switch स्टेटमेंट लिखने से बचा जाता है (और संभवतया नए मामलों को स्विच स्टेटमेंट में भूल जाने पर जब एनम बढ़ाया जाता है)। उदाहरण के लिए JSDoc enum एनोटेशन के साथ प्रलेखित एनम गुण और प्रकार को भी दिखाया गया है।

समानताएं Colors.RED === Colors.RED साथ अपेक्षित रूप से काम करती हैं। Colors.RED === Colors.RED true , और Colors.RED === Colors.BLUE false


यदि आपको शुद्ध ईएस 6 की आवश्यकता नहीं है और टाइपस्क्रिप्ट का उपयोग कर सकते हैं, तो इसके पास एक अच्छा एनम है:

https://www.typescriptlang.org/docs/handbook/enums.html


यह मेरा व्यक्तिगत दृष्टिकोण है।

class ColorType {
    static get RED () {
        return "red";
    }

    static get GREEN () {
        return "green";
    }

    static get BLUE () {
        return "blue";
    }
}

// Use case.
const color = Color.create(ColorType.RED);

टाइपस्क्रिप्ट कैसे करता है, इसकी जाँच करें। मूल रूप से वे निम्नलिखित कार्य करते हैं:

const MAP = {};

MAP[MAP[1] = 'A'] = 1;
MAP[MAP[2] = 'B'] = 2;

MAP['A'] // 1
MAP[1] // A

प्रतीकों का उपयोग करें, ऑब्जेक्ट को फ्रीज करें, जो आप चाहते हैं।






symbols