मैं एक ऐसे उत्तर की तलाश में था जो एक enumसे प्राप्त कर सकता है string, लेकिन मेरे मामले में, enums मूल्यों में अलग-अलग स्ट्रिंग मान प्रतिपक्ष थे। ओपी के लिए एक सरल पहेली थी Color, लेकिन मेरे पास कुछ अलग था:
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
जब आप Gender.CantTellएक "Can't tell"स्ट्रिंग के साथ हल करने का प्रयास करते हैं , तो यह undefinedमूल उत्तर के साथ लौटता है ।
एक और जवाब
मूल रूप से, मैं एक और जवाब के साथ आया, दृढ़ता से इस जवाब से प्रेरित :
export const stringToEnumValue = <ET, T>(enumObj: ET, str: string): T =>
(enumObj as any)[Object.keys(enumObj).filter(k => (enumObj as any)[k] === str)[0]];
टिप्पणियाँ
- हम पहले परिणाम को लेते हैं
filter, मान लेते हैं कि ग्राहक एनम से एक वैध स्ट्रिंग पारित कर रहा है। यदि ऐसा नहीं है, undefinedतो वापस कर दिया जाएगा।
- हम कलाकारों
enumObjके लिए anyक्योंकि साथ टाइपप्रति 3.0+ (वर्तमान में टाइपप्रति 3.5 का प्रयोग करके), enumObjके रूप में हल हो गई है unknown।
उपयोग का उदाहरण
const cantTellStr = "Can't tell";
const cantTellEnumValue = stringToEnumValue<typeof Gender, Gender>(Gender, cantTellStr);
console.log(cantTellEnumValue); // Can't tell
नोट: और, जैसा कि किसी ने टिप्पणी में बताया है, मैं भी इसका उपयोग करना चाहता था noImplicitAny।
अपडेट किया गया वर्ज़न
कोई कास्ट anyऔर उचित टाइपिंग के लिए नहीं।
export const stringToEnumValue = <T, K extends keyof T>(enumObj: T, value: string): T[keyof T] | undefined =>
enumObj[Object.keys(enumObj).filter((k) => enumObj[k as K].toString() === value)[0] as keyof typeof enumObj];
इसके अलावा, अपडेट किए गए संस्करण में इसे कॉल करने का एक आसान तरीका है और यह अधिक पठनीय है:
stringToEnumValue(Gender, "Can't tell");
--noImplicitAny(वीएस अनियंत्रित "अंतर्निहित 'किसी भी प्रकार के" अनुमति दें ")। यहerror TS7017: Index signature of object type implicitly has an 'any' type.मेरे लिए यह काम करता है:var color: Color = (<any>Color)[green];(संस्करण 1.4 के साथ परीक्षण किया गया)