টাইপস্ক্রিপ্টে এনামে মান বিদ্যমান কিনা তা পরীক্ষা করুন


163

আমি একটি নম্বর পেয়েছি type = 3এবং এই এনামটিতে এটি আছে কিনা তা পরীক্ষা করে দেখতে হবে:

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

আমি খুঁজে পাওয়ার সেরা উপায়টি হ'ল অ্যারের হিসাবে সমস্ত এনাম মানগুলি পাওয়া এবং এটিতে সূচিপত্র ব্যবহার করা। তবে ফলাফলযুক্ত কোড খুব স্পষ্টত নয়:

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

এটি করার একটি সহজ উপায় আছে?


if(Object.values(MESSAGE_TYPE).includes(+type)? আপনি করার মতো অনেক কিছুই নেই।
অ্যান্ড্রু লি

1
এটি ES6 এ কাজ করে তবে দুর্ভাগ্যক্রমে ES5 তে নয়
টিম শোচ

@ টিমসচচ আপনি !!MESSAGE_TYPE[type]কোনও মান বিদ্যমান কিনা তা যাচাই করতে কেবলমাত্র করতে পারেন। MESSAGE_TYPE[type]মান typeবিদ্যমান না থাকলে অপরিবর্তিত ফিরে আসবেMESSAGE_TYPE
কেভিন

1
@ কেভিন বেবকক এটি এনাম মানচিত্রের মানচিত্রগুলির মধ্যে একটিতে ব্যর্থ হবে 0
ইনগো বার্ক

@ ইঙ্গো বার্ক দুর্দান্ত পয়েন্ট! আমি অনুমান করি যে একটি স্পষ্ট চেক করা যেতে পারেMESSAGE_TYPE[type] !== undefined
কেভিন বাবকক

উত্তর:


212

আপনি যদি এটি স্ট্রিং এনামগুলির সাথে কাজ করতে চান তবে আপনাকে ব্যবহার করতে হবে 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
জেএসওনলিন্ট প্রদর্শিত হচ্ছে Property 'values' does not exist on type 'ObjectConstructor'
বিবিসিঞ্জার

5
টাইপস্ক্রিপ্টে বিবিসিঞ্জার এর পরিবর্তে এটি ব্যবহার করে দেখুন:(<any>Object).values(Vehicle).includes(Vehicle.car)
সালেম ওয়ারডানি

1
চমৎকার। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আমার এনাম কীগুলি এবং মানগুলি পৃথক হলে স্বীকৃত উত্তরটি কাজ করবে না
প্রতাপ একে

2
এটি টাইপ স্ক্রিপ্টে কাজ করে না। আইই
জেরিন জোসেফ

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
}

এটি কেবল সঠিক এনামগুলির সাথে কাজ করে, তাই না? বর্তমানে এটি এরূপ হিসাবে সংজ্ঞায়িত হয়েছে:export const MESSAGE_TYPE = { ... }
টিম শোচ

হ্যাঁ. শুধুমাত্র সঠিক enums দিয়ে with
সরভানা

ঠিক আছে, ব্যাখ্যার জন্য ধন্যবাদ। আমরা কেন সঠিক এনাম ব্যবহার করছি না তা পরীক্ষা করে দেখব এবং এটি পরিবর্তন করতে পারি কিনা তা দেখুন see
টিম শোচ

MESSAGE_TYPEআপনার পরামর্শ অনুসারে আমরা একটি প্রকৃত এনামে পরিবর্তিত হয়েছি এবং এখন আপনার সমাধানটি কবজির মতো কাজ করে। ধন্যবাদ @ সরভানা
টিম শোচ

71
এই স্ট্রিং enums সাথে কাজ করে না, কারণ তারা রিভার্স ম্যাপ নেই 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
সুতরাং এই উদাহরণটি কেবল কী == মান ব্যবহার করছে এবং এ কারণেই এটি কাজ করে, তাই না? যদি কী! = মান হয় তবে এটি কী দ্বারা পরীক্ষা করতে হবে।
কনস্ট্যান্টিন পেলেপিলিন

13
আসলে এই ঘটনাটি কেবল একটি কাকতালীয় কারণে কাজ করে। 'এনাম 1' কেবলমাত্র পাওয়া যাবে কারণ এটি কীটির সমান মান। তবে কীগুলি মানগুলির থেকে পৃথক হলে এটি কাজ করে না।
lukas_o

3
@ লিউকাস_ও এ সম্পর্কে সঠিক। এই সমাধানটি প্রথম নজরে পরিষ্কার দেখায় তবে এটি অবশ্যই বাগ প্রবণ।
পাইওট্রোস

14

আপনার প্রশ্নের একটি খুব সহজ এবং সহজ সমাধান আছে:

var districtId = 210;

if (DistrictsEnum[districtId] != null) {

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

আপনার উত্তরের জন্য আপনাকে ধন্যবাদ যেহেতু আমি প্রোগ্রামিং থেকে ফুলটাইম ইউএক্স ডিজাইনে চলে এসেছি আমি আর এটি যাচাই করতে পারি না। @ জনাকীর্ণ, আমাকে যদি জানানো হয় যে আমি যদি স্বীকৃত উত্তরটি এখনও 2019 সালে যাওয়ার উপায় হয়! চিয়ার্স
টিম শোচ

2
@ টিমসচচ আমি কমপক্ষে সংখ্যাযুক্ত এনামগুলির জন্য এটি খুব ভাল কাজ করে তা নিশ্চিত করতে পারি। এটি সবচেয়ে মার্জিত সমাধান ইমো।
প্যাট্রিক পি।

@PatrickP। আপনি কি নিশ্চিত করতে পারেন যে এসটারের প্রস্তাবিত সমাধানটি স্ট্রিং এনামগুলিতেও কাজ করে?
টিম শোচ

1
@ টিমস্কোচ হ্যাঁ! এটি স্ট্রিংয়ের জন্যও কাজ করে। অভিধানের মতো - আপনি অভিধানের কীগুলির জন্য যে কোনও প্রকারের ব্যবহার করতে পারেন।
এসটার কাউফম্যান

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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.