আমি কোন উত্তর যে পেতে পারেন খুঁজছেন ছিল enumএকটি থেকে string, কিন্তু আমার ক্ষেত্রে, enums মান আলাদা স্ট্রিং মান সহযোগীর ছিল। ওপিতে একটি সহজ এনাম Colorছিল তবে আমার কিছু আলাদা ছিল:
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
আপনি যখন স্ট্রিং Gender.CantTellদিয়ে সমাধান করার চেষ্টা করবেন "Can't tell", এটি undefinedআসল উত্তর দিয়ে ফিরে আসবে ।
আর একটি উত্তর
মূলত, আমি এই উত্তর থেকে দৃ strongly়ভাবে অনুপ্রাণিত হয়ে অন্য একটি উত্তর নিয়ে এসেছি :
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অভিমানী ক্লায়েন্ট enum থেকে একটি বৈধ স্ট্রিং ক্ষণস্থায়ী হয়। যদি এটি না হয় তবে 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।
নতুন সংস্করণ
কোনও cast 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 সহ পরীক্ষিত)