2015-06-11 7 views
9

क्या एनम में पैरामीटर के प्रकार को सेट करना संभव नहीं है? इस तरह:टाइपम में पैरामीटर के रूप में Enum

private getRandomElementOfEnum(e : enum):string{ 
    var length:number = Object.keys(e).length; 
    return e[Math.floor((Math.random() * length)+1)]; 
} 

यदि मैं ऐसा करता हूं, तो इंटेलिज़ इस कोड को अज्ञात के रूप में चिह्नित करता है। और चर का नाम बदलने का सुझाव है, क्या यह समझ में आता है?

private getRandomElementOfEnum(e : any):string{ 
    var length:number = Object.keys(e).length; 
    return e[Math.floor((Math.random() * length)+1)]; 
} 

यह कोड ठीक काम करता है। लेकिन सुरुचिपूर्ण और कोड-सम्मेलन के रूप में नहीं है।

क्या पैरामीटर के रूप में एक enum को परिभाषित करने के लिए कोई संभावना या थोड़ा कामकाज है?

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

उन जवाब अध्ययन करने के बाद, मैं परिभाषित enum की आह सेट के साथ भी ऐसा कर सकते हैं, sth समान enum1 लिए | enum2 | enum3?

+2

यह 'ई: MyEnumType' नहीं होना चाहिए? या आप किसी भी तरह के enum स्वीकार करना चाहते हैं। वह क्या अच्छा होगा? आप 'ई: माईएनम | मायऑथरम | माई थर्ड एनीम' भी कर सकते हैं। – Thilo

+0

संबंधित (लेकिन संभवतः आउट-डेटेड): http: // stackoverflow।कॉम/प्रश्न/21293063/कैसे-टू-प्रोग्रामेटिक-एन्युमेरेट-एन-एनम-टाइप-इन-टाइपस्क्रिप्ट-0-9-5? आरक्यू = 1 – Thilo

+0

प्रत्येक एनम संभव होना चाहिए, इसलिए मैं हर एनम का एएच यादृच्छिक तत्व प्राप्त कर सकता हूं इस समारोह को बुलाकर। – Synoon

उत्तर

8

यह सुनिश्चित करना संभव नहीं है कि पैरामीटर एक enum है, क्योंकि टीएस में गणनाएं एक सामान्य पूर्वजों या इंटरफ़ेस से प्राप्त नहीं होती हैं।

टाइपस्क्रिप्ट स्थिर विश्लेषण लाता है। आपका कोड Object.keys और e[dynamicKey] के साथ गतिशील प्रोग्रामिंग का उपयोग करता है। गतिशील कोड के लिए, प्रकार any सुविधाजनक है।

आपका कोड गाड़ी है: length() मौजूद नहीं है, e[Math.floor((Math.random() * length)+1)] एक स्ट्रिंग या एक पूर्णांक, और the enumeration values can be manually set रिटर्न ...

यहाँ एक सुझाव है:

function getRandomElementOfEnum<E>(e: any): E { 
    var keys = Object.keys(e), 
     index = Math.floor(Math.random() * keys.length), 
     k = keys[index]; 
    if (typeof e[k] === 'number') 
     return <any>e[k]; 
    return <any>parseInt(k, 10); 
} 

function display(a: Color) { 
    console.log(a); 
} 

enum Color { Blue, Green }; 
display(getRandomElementOfEnum<Color>(Color)); 

आदर्श रूप में, पैरामीटर प्रकार any होना चाहिए typeof E द्वारा प्रतिस्थापित किया गया लेकिन संकलक (टीएस 1.5) इस वाक्यविन्यास को समझ नहीं सकता है।

+0

हेहे, मेरा कोड वास्तव में छोटी गाड़ी थी, मुझे एहसास हुआ कि लगभग 10 मिनट बाद, कोड को यहां बदलना भूल गया .. – Synoon

10

आप any की तुलना में बेहतर कर सकते हैं:

enum E1 { 
    A, B, C 
} 
enum E2 { 
    X, Y, Z 
} 

function getRandomElementOfEnum(e: { [s: number]: string }): number { 
    /* insert working implementation here */ 
    return undefined; 
} 

// OK 
var x: E1 = getRandomElementOfEnum(E1); 
// Error 
var y: E2 = getRandomElementOfEnum(window); 
// Error 
var z: string = getRandomElementOfEnum(E2); 
+0

कंपाइलर मानता है कि '{1: संख्या: स्ट्रिंग} 'के साथ' E1' मिलान 'है, लेकिन है यह बारहमासी है? ऑब्जेक्ट 'ई 1' में स्ट्रिंग कुंजियां हैं। – Paleo

+3

संख्या सूचकांक गैर-संख्या कुंजी प्रकारों को बाधित नहीं करते हैं –

3

मैं @Tarh से सहमत हैं। टाइपस्क्रिप्ट में एन्म्स सिर्फ एक सामान्य इंटरफ़ेस या प्रोटोटाइप के बिना जावास्क्रिप्ट ऑब्जेक्ट्स हैं (और यदि वे const enum हैं, तो वे ऑब्जेक्ट भी नहीं हैं), इसलिए आप प्रकारों को "किसी भी enum" तक सीमित नहीं कर सकते हैं।

निकटतम

मैं मिल सकता है की तरह कुछ है निम्नलिखित:

enum E1 { 
    A, B, C 
} 
enum E2 { 
    X, Y, Z 
} 

// make up your own interface to match TypeScript enums 
// as closely as possible (not perfect, though) 
interface Enum { 
    [id: number]: string 
} 

function getRandomElementOfEnum(e: Enum): string { 
    let length = Object.keys(e).length/2; 
    return e[Math.floor((Math.random() * length))]; 
} 

यह सब enums के लिए काम करता है, लेकिन यह भी इनपुट के रूप में अन्य सारणियों स्वीकार करते हैं (और फिर विफल हो जाएगा क्योंकि विधि शरीर बहुत ही विशेष पर निर्भर करता है टाइपस्क्रिप्ट एनम्स की मुख्य संरचना है)।

तो जब तक कि आपको इस तरह के "जेनेरिक" फ़ंक्शन की वास्तविक आवश्यकता न हो, तब तक व्यक्तिगत enum प्रकारों (या E1|E2|E3 जैसे संघ प्रकार) के लिए टाइपएफ़ फ़ंक्शन बनाएं, जिन्हें आपको वास्तव में आवश्यकता है।

और यदि आपके पास यह आवश्यकता है (और यह बहुत अच्छी तरह से एक एक्स-वाई-समस्या हो सकती है जिसे अधिक बेहतर तरीके से हल किया जा सकता है, तो अधिक संदर्भित किया जा सकता है), any का उपयोग करें, क्योंकि आपने टाइपएफ़ क्षेत्र को वैसे भी छोड़ा है।

+0

मैंने इस सिद्धांत का परीक्षण नहीं किया है, लेकिन मुझे पूरा यकीन है कि आपका कार्यान्वयन 'enum E3 {X = 4, Y, Z} का समर्थन नहीं करता है। –

संबंधित मुद्दे