टाइपस्क्रिप्ट में मान मौजूद है कि जाँच करें


163

मैं एक संख्या प्राप्त करता हूं type = 3और यह देखना चाहता हूं कि क्या यह इस एनम में मौजूद है:

export const MESSAGE_TYPE = {
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4,
};

सबसे अच्छा तरीका मैंने पाया है कि सभी Enum मानों को एक सरणी के रूप में प्राप्त करना और उस पर indexOf का उपयोग करना। लेकिन परिणामी कोड बहुत सुपाठ्य नहीं है:

if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) {
    // do stuff ...
}

क्या ऐसा करने का एक सरल तरीका है?


if(Object.values(MESSAGE_TYPE).includes(+type)? बहुत कुछ नहीं है जो आप कर सकते हैं।
एंड्रयू ली

1
यह ES6 में काम करता है लेकिन दुर्भाग्य से ES5 में नहीं
टिम शुक

@TimSchoch आप केवल यह !!MESSAGE_TYPE[type]जांच सकते हैं कि कोई मान मौजूद है या नहीं। MESSAGE_TYPE[type]अपरिभाषित वापस आ जाएगी, तो के मूल्य typeपर मौजूद नहीं हैMESSAGE_TYPE
केविन बैबकॉक

1
@ केविन बेबकॉक 0, हालांकि, एनम मूल्यों के नक्शों में से एक को विफल कर देगा ।
इंगो बुर्क

@ इंगो बुर्क ग्रेट पॉइंट! मुझे लगता है कि एक स्पष्ट जांच किया जा सकता हैMESSAGE_TYPE[type] !== undefined
केविन बैबकॉक

जवाबों:


213

यदि आप इसे स्ट्रिंग एनम के साथ काम करना चाहते हैं, तो आपको इसका उपयोग करने की आवश्यकता है Object.values(ENUM).includes(ENUM.value)क्योंकि https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html के अनुसार स्ट्रिंग एनम रिवर्स मैप नहीं किए गए हैं :

Enum Vehicle {
    Car = 'car',
    Bike = 'bike',
    Truck = 'truck'
}

हो जाता है:

{
    Car: 'car',
    Bike: 'bike',
    Truck: 'truck'
}

तो आपको बस करने की आवश्यकता है:

if (Object.values(Vehicle).includes('car')) {
    // Do stuff here
}

यदि आपको इसके लिए कोई त्रुटि मिलती है: Property 'values' does not exist on type 'ObjectConstructor'तो आप ES2017 को लक्षित नहीं कर रहे हैं। आप या तो इस tsconfig.json कॉन्फ़िगरेशन का उपयोग कर सकते हैं:

"compilerOptions": {
    "lib": ["es2017"]
}

या आप बस किसी भी कास्ट कर सकते हैं:

if ((<any>Object).values(Vehicle).includes('car')) {
    // Do stuff here
}

7
JSONLint दिखा रहा है Property 'values' does not exist on type 'ObjectConstructor'
बीबीसिंगर

5
टाइप में टाइप @Baysinger इस कोशिश:(<any>Object).values(Vehicle).includes(Vehicle.car)
सलेम Ouerdani

1
अति उत्कृष्ट। यह स्वीकृत उत्तर होना चाहिए। अगर मेरी एनम कीज़ और मान अलग
प्रताप एके

2
यह टाइपस्क्रिप्ट में काम नहीं करता है। इसके अलावा आसपास के काम IE में टूटता है
जेरिन जोसेफ

3
मेरा मानना ​​है कि यह इस सवाल का जवाब नहीं है। आपका समाधान (Object.values(Vehicle).includes(Vehicle.car))हमेशा सही होगा, लेकिन सवाल यह है कि जांच कैसे की जाती है कि किसी दिए गए मूल्य को एनम में शामिल किया गया है, उदाहरण के लिए (Object.values(Vehicle).includes('car'))वापस लौटना चाहिए , trueलेकिन (Object.values(Vehicle).includes('plane'))गलत होना चाहिए।
tommybernaciak

140

यदि आप टाइपस्क्रिप्ट का उपयोग कर रहे हैं, तो आप एक वास्तविक एनम का उपयोग कर सकते हैं । तब आप इसका उपयोग करके जांच कर सकते हैंin

यह तभी काम करता है जब आपका एनम नंबर-आधारित हो और चिह्नित न होconst :

export enum MESSAGE_TYPE {
    INFO = 1,
    SUCCESS = 2,
    WARNING = 3,
    ERROR = 4,
};

var type = 3;

if (type in MESSAGE_TYPE) {

}

यह काम करता है क्योंकि जब आप उपरोक्त एनम संकलित करते हैं, तो यह नीचे दी गई वस्तु उत्पन्न करता है:

{
    '1': 'INFO',
    '2': 'SUCCESS',
    '3': 'WARNING',
    '4': 'ERROR',
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4
}

यह केवल उचित enums के साथ काम करता है, है ना? वर्तमान में इसे इस प्रकार परिभाषित किया गया है:export const MESSAGE_TYPE = { ... }
टिम शॉच

हाँ। केवल उचित दुश्मनी के साथ।
सरवण

ठीक है, स्पष्टीकरण के लिए धन्यवाद। मैं जाँच करूँगा कि हम एक उचित एनम का उपयोग क्यों नहीं कर रहे हैं और देखें कि क्या हम इसे बदल सकते हैं।
टिम शॉच

हमने MESSAGE_TYPEआपके सुझाव के अनुसार एक वास्तविक एनम में बदल दिया और अब आपका समाधान एक आकर्षण की तरह काम करता है। धन्यवाद @ सरवाना
टिम

71
यह स्ट्रिंग एनम के साथ काम नहीं करता है क्योंकि वे रिवर्स मैप नहीं होते हैं: typescriptlang.org/docs/handbook/release-notes/…
Xiv

20

टाइपस्क्रिप्ट v3.7.3

export enum YourEnum {
   enum1 = 'enum1',
   enum2 = 'enum2',
   enum3 = 'enum3',
}

const status = 'enumnumnum';

if (!(status in YourEnum)) {
     throw new UnprocessableEntityResponse('Invalid enum val');
}

3
मुझे यह सबसे ज्यादा पसंद है
एशले कूलमैन

3
तो यह उदाहरण सिर्फ कुंजी == मूल्य का उपयोग कर रहा है और यही कारण है कि यह काम करता है, है ना? यदि कुंजी! = मान है, तो यह कुंजी द्वारा जांच करेगा।
कॉन्स्टेंटिन पेलेपेलिन 20

14
दरअसल यह मामला केवल एक संयोग के कारण काम करता है। 'enum1' केवल इसलिए मिलेगा क्योंकि यह कुंजी के समान ही है। लेकिन अगर चाबियाँ उन मूल्यों से भिन्न होती हैं जो काम नहीं करते हैं।
लुकास_ओ

3
@lukas_o इस बारे में सही है। यह समाधान पहली नज़र में स्पष्ट दिखता है, लेकिन यह निश्चित रूप से बग-प्रवण है।
पोर्तोस

14

आपके प्रश्न का एक बहुत ही सरल और आसान समाधान है:

var districtId = 210;

if (DistrictsEnum[districtId] != null) {

// Returns 'undefined' if the districtId not exists in the DistrictsEnum 
    model.handlingDistrictId = districtId;
}

आपके उत्तर के लिए धन्यवाद एस्टर। चूंकि मैं प्रोग्रामिंग से फुलटाइम यूएक्स डिज़ाइन में स्थानांतरित हो गया हूं इसलिए मैं इसे सत्यापित नहीं कर सकता। @crowd, मुझे बताएं कि क्या मैं स्वीकृत उत्तर अभी भी 2019 में जाने का तरीका है! चीयर्स
टिम शॉच

2
@TimSchoch मैं इस बात की पुष्टि कर सकता हूं कि कम से कम अंकसूचियों के लिए यह अच्छी तरह से काम करता है। यह सबसे सुरुचिपूर्ण समाधान imho है।
पैट्रिक पी।

@PatrickP। क्या आप पुष्टि कर सकते हैं कि एस्टर द्वारा प्रस्तावित समाधान स्ट्रिंग एनम के लिए भी काम करता है?
टिम स्कोच

1
@TimSchoch हाँ! यह तार के लिए भी काम करता है। डिक्शनरी की तरह - आप शब्दकोश में कुंजियों के लिए किसी भी प्रकार का उपयोग कर सकते हैं।
एस्टर कॉफ़मैन

9
ध्यान दें कि यह एनम स्ट्रिंग के लिए काम नहीं करता है यदि एनम एनर सदस्य के नामों की तुलना में विभिन्न मूल्यों के साथ स्ट्रिंग इनिशियलाइज़र का उपयोग करता है। नीचे @ Xiv का जवाब देखें: stackoverflow.com/a/47755096/4752920
kcstricks

5
export enum UserLevel {
  Staff = 0,
  Leader,
  Manager,
}

export enum Gender {
  None = "none",
  Male = "male",
  Female = "female",
}

लॉग में अंतर परिणाम:

log(Object.keys(Gender))
=>
[ 'None', 'Male', 'Female' ]

log(Object.keys(UserLevel))
=>
[ '0', '1', '2', 'Staff', 'Leader', 'Manager' ]

समाधान, हमें एक संख्या के रूप में कुंजी को हटाने की आवश्यकता है।

export class Util {
  static existValueInEnum(type: any, value: any): boolean {
    return Object.keys(type).filter(k => isNaN(Number(k))).filter(k => type[k] === value).length > 0;
  }
}

प्रयोग

// For string value
if (!Util.existValueInEnum(Gender, "XYZ")) {
  //todo
}

//For number value, remember cast to Number using Number(val)
if (!Util.existValueInEnum(UserLevel, 0)) {
  //todo
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.