স্ট্রিং মান সহ একটি এনাম তৈরি করুন


262

নিম্নলিখিত কোডটি enumটাইপস্ক্রিপ্টে একটি তৈরি করতে ব্যবহার করা যেতে পারে :

enum e {
    hello = 1,
    world = 2
};

এবং মানগুলি দ্বারা অ্যাক্সেস করা যেতে পারে:

e.hello;
e.world;

enumস্ট্রিং মান সহ আমি কীভাবে তৈরি করব ?

enum e {
    hello = "hello", // error: cannot convert string to e
    world = "world"  // error 
};

উত্তর:


409

টাইপস্ক্রিপ্ট ২.৪

এখন স্ট্রিং এনাম রয়েছে যাতে আপনার কোডটি কেবল কাজ করে:

enum E {
    hello = "hello",
    world = "world"
};

🌹

প্রকারলিপি 1.8

যেহেতু টাইপস্ক্রিপ্ট ১.৮ আপনি নামযুক্ত স্ট্রিং মানগুলির জন্য নির্ভরযোগ্য এবং নিরাপদ অভিজ্ঞতা সরবরাহ করতে স্ট্রিং আক্ষরিক প্রকারগুলি ব্যবহার করতে পারেন (যা আংশিকভাবে এনামগুলির জন্য ব্যবহৃত হয়)।

type Options = "hello" | "world";
var foo: Options;
foo = "hello"; // Okay 
foo = "asdf"; // Error!

আরও: https://www.typescriptlang.org/docs/handbook/advanced-tyype.html#string-literal-tyype

উত্তরাধিকার সমর্থন

টাইপস্ক্রিপ্টে এনামগুলি সংখ্যা ভিত্তিক।

আপনি স্থির সদস্যদের সহ একটি শ্রেণি ব্যবহার করতে পারেন যদিও:

class E
{
    static hello = "hello";
    static world = "world"; 
}

আপনি পাশাপাশি যেতে পারেন:

var E = {
    hello: "hello",
    world: "world"
}

আপডেট:var test:E = E.hello; নীচের মতো কিছু করতে সক্ষম হওয়ার প্রয়োজনীয়তার ভিত্তিতে এটি সন্তুষ্ট:

class E
{
    // boilerplate 
    constructor(public value:string){    
    }

    toString(){
        return this.value;
    }

    // values 
    static hello = new E("hello");
    static world = new E("world");
}

// Sample usage: 
var first:E = E.hello;
var second:E = E.world;
var third:E = E.hello;

console.log("First value is: "+ first);
console.log(first===third); 

সামান্য উন্নতি:toString(): string { return this.value; }
psulek

@psulek প্রকৃতপক্ষে টাইপস্ক্রিপ্ট অনুমান করবে যে toStringস্ট্রিংটি ফেরত দেয় কারণ এটি ফিরে আসে this.valueএবং valueটাইপ স্ট্রিংয়ের হয়। সুতরাং আপনি করতে পারবেন না var x:number = E.hello.toString();এবং আপনি যদি var x = E.hello.toString();এক্স করেন তবে তা টাইপ হওয়ার জন্যও অনুধাবন করা হয় string:)
বাসারত

2
@ বাসরাত এটি সত্য যে টাইপস্ক্রিপ্ট এ জাতীয় কেস পরিচালনা করে থাকে, তবে আমি বলতে চাইছি প্রতিবারই আমরা এটি জানার সাথে রিটার্নের ধরণের পদ্ধতিগুলি সজ্জিত করেছি, এমনকি টিএস সংকলকটির জন্য এটি প্রয়োজনীয় নয়, তবে আমাদের কোডাররা জানতে পেরেছিলেন যে আমরা কখন পদ্ধতির সংজ্ঞাটি দেখি কি এটি ফেরত টাইপ করুন।
psulek

@ বাসারত get()পদ্ধতিটি প্রতিস্থাপনের কোনও খারাপ দিক রয়েছে return this.valueকি? এইভাবে এটি যখনই অ্যাক্সেস করা হবে স্ট্রিংয়ের মানটি ফিরিয়ে দেবে এবং রূপান্তর করার সময় নয় toString()
জন

@ বাসারত যদি আপনার মতো বেশ কয়েকটি "এনাম" থাকে তবে কাঠামোগত টাইপিংয়ের কারণে সংকলক তাদের মধ্যে পার্থক্য করতে পারে না - সংকলক valueসব ধরণের সদস্যকে দেখতে পাবে এবং তাদের তুলনামূলক প্রকার হিসাবে বিবেচনা করবে। আপনি valueসদস্য যদিও ব্যক্তিগত করতে পারে । এইভাবে সংকলক এটি দেখতে পাবে না এবং কাঠামোগত টাইপিং প্রয়োগ করার চেষ্টা করবে না।
কিরিল জি।

113

টাইপস্ক্রিপ্টের সর্বশেষ সংস্করণে (1.0RC), আপনি এই জাতীয় এনাম ব্যবহার করতে পারেন:

enum States {
    New,
    Active,
    Disabled
} 

// this will show message '0' which is number representation of enum member
alert(States.Active); 

// this will show message 'Disabled' as string representation of enum member
alert(States[States.Disabled]);

আপডেট 1

স্ট্রিংয়ের মান থেকে এনাম সদস্যের নম্বর পেতে, আপনি এটি ব্যবহার করতে পারেন:

var str = "Active";
// this will show message '1'
alert(States[str]);

আপডেট 2

সর্বশেষতম টাইপস্ক্রিপ্ট ২.৪-তে, স্ট্রিং এনামগুলি চালু করা হয়েছিল, যেমন:

enum ActionType {
    AddUser = "ADD_USER",
    DeleteUser = "DELETE_USER",
    RenameUser = "RENAME_USER",

    // Aliases
    RemoveUser = DeleteUser,
}

টাইপস্ক্রিপ্ট ২.৪ সম্পর্কে আরও তথ্যের জন্য, এমএসডিএন-তে ব্লগ পড়ুন ।


2
সাধারণত, এই সমাধানটিকে অগ্রাধিকার দেওয়া হয় (এটি একটি বাস্তব এনাম হিসাবে) তবে আপনি এনাম নামটি (তাই 'স্ট্রিং') কী তা সম্পর্কে খুব সীমাবদ্ধ থাকেন।
জেসনস 16

2
আজকের হিসাবে সেরা সমাধান।
অ্যালন আমির

2
এই নতুন কিছু? কারণ States[str]আজকাল কাজ করে না। Type 'string' is not assignable to type 'States'
মিঃক্রফট

1
@ এমআরক্রাফ্ট আপনি ব্যবহার করতে পারেন: টাইপস্ক্রিপ্টের States[str as any]বর্তমান (2.x) সংস্করণে করতে।
psulek

রাজ্যগুলি [str] যা আমি খুঁজছিলাম। ধন্যবাদ!
মার্টিন কোনিসেক

81

টাইপস্ক্রিপ্ট 2.4+ +

আপনি এখন এনাম সদস্যদের জন্য সরাসরি স্ট্রিংয়ের মান নির্ধারণ করতে পারেন:

enum Season {
    Winter = "winter",
    Spring = "spring",
    Summer = "summer",
    Fall = "fall"
}

আরও তথ্যের জন্য # 15486 দেখুন ।

প্রকারলিপি 1.8+

টাইপস্ক্রিপ্ট ১.৮+ তে, মানগুলির তালিকার জন্য আপনি টাইপ এবং একই নামের একটি অবজেক্টের সংজ্ঞা দিতে স্ট্রিং আক্ষরিক প্রকার তৈরি করতে পারেন। এটি একটি স্ট্রিং এনামের প্রত্যাশিত আচরণের নকল করে।

এখানে একটি উদাহরণ:

type MyStringEnum = "member1" | "member2";

const MyStringEnum = {
    Member1: "member1" as MyStringEnum,
    Member2: "member2" as MyStringEnum
};

যা স্ট্রিং এনুমের মতো কাজ করবে:

// implicit typing example
let myVariable = MyStringEnum.Member1; // ok
myVariable = "member2";                // ok
myVariable = "some other value";       // error, desired

// explict typing example
let myExplicitlyTypedVariable: MyStringEnum;
myExplicitlyTypedVariable = MyStringEnum.Member1; // ok
myExplicitlyTypedVariable = "member2";            // ok
myExplicitlyTypedVariable = "some other value";   // error, desired

অবজেক্টে সমস্ত স্ট্রিং টাইপ করার বিষয়টি নিশ্চিত করুন! আপনি যদি না করেন তবে উপরের প্রথম উদাহরণটিতে ভেরিয়েবলটি স্পষ্টভাবে টাইপ করা হবে না MyStringEnum


1
আমি কীভাবে কোনও ঘোষণাপত্রের অনুরূপ কিছু সংজ্ঞায়িত করতে পারি?
জেভ স্পিটজ

আপনি কি করতে পারেন @ZevSpitz এই
ডেভিড Sherret

লক্ষণীয় যে বর্তমান সংকলকটি দিয়ে আপনি মাইস্ট্রিংইনামে স্ট্রিংয়ের মানগুলি ভুল টাইপ করতে পারেন এবং এটি অভিযোগ করবে না। আমার স্ট্রিং সর্বদা বৈধ কিনা তা নিশ্চিত করার জন্য আমি একটি 'এনফোর্সর' ইন্টারফেস তৈরি করেছি। উদাহরণস্বরূপ: ইন্টারফেস MyStringEnumEnforcer {সদস্য 1: MyStringEnum, সদস্য 2: MyStringEnum} তারপরে MyStringEnum: MyStringEnumEnforcer = {সদস্য 1: "সদস্য 1", সদস্য 2: "সদস্য 2" although এটি ভুল টাইপযুক্ত স্ট্রিংগুলির জন্য কাজ করতে পারে না যদিও সংকলকটি আপনার জন্য কাজ করতে পারে মূল দৃশ্য অবশেষে। এই পদ্ধতির সাথে অনেক অনুষ্ঠান আছে তবে আমি সুরক্ষাটি পছন্দ করি।
জর্মোক


40

টাইপস্ক্রিপ্ট ০.৯.০.১ এ, যদিও এটি একটি সংকলক ত্রুটি দেখা দেয়, সংকলকটি এখনও টিএস ফাইলটি জেএস ফাইলে সংকলন করতে পারে। কোডটি আমাদের প্রত্যাশা মতো কাজ করে এবং ভিজ্যুয়াল স্টুডিও 2012 স্বয়ংক্রিয় কোড সমাপ্তির জন্য সমর্থন করতে পারে।

হালনাগাদ :

সিনট্যাক্সে, টাইপস্ক্রিপ্ট আমাদের স্ট্রিং মানগুলির সাথে এনাম তৈরি করতে দেয় না, তবে আমরা সংকলকটি হ্যাক করতে পারি: পি

enum Link
{
    LEARN   =   <any>'/Tutorial',
    PLAY    =   <any>'/Playground',
    GET_IT  =   <any>'/#Download',
    RUN_IT  =   <any>'/Samples',
    JOIN_IN =   <any>'/#Community'
}

alert('Link.LEARN:    '                     + Link.LEARN);
alert('Link.PLAY:    '                      + Link.PLAY);
alert('Link.GET_IT:    '                    + Link.GET_IT);
alert('Link[\'/Samples\']:    Link.'        + Link['/Samples']);
alert('Link[\'/#Community\']    Link.'      + Link['/#Community']);

খেলার মাঠ


1
নিস হ্যাক, কিন্তু আপনি একটি সুইচ বিবৃতি যেমন এই enum / ধ্রুবক ব্যবহার করতে পারবেন না case Link.LEARN:একটি পাবেন Cannot convert 'Link.LEARN' to 'string'বিল্ড ত্রুটি। Ingালাই কাজ করবে না।
কোডিং গেছে

@ ট্রু ব্লুউউসি এটি আমার পক্ষে টিএসসি 1.0.0.0 চালানোর পক্ষে ভাল কাজ করেছে বলে মনে হচ্ছে। এছাড়াও, যদি কোনও কারণে আপনার কেস স্টেটমেন্টে একটি স্ট্রিং ধ্রুবক / পরিবর্তনশীল রাখার দরকার হয় তবে আপনি যদি এটি কোনওটিতে ফেলে দেন তবে এটি কাজ করবে।
কোডএন্ডক্যাটস

1
এছাড়াও, ধন্যবাদ @ zjc0816, আমি এই সমাধানটিকে ভালবাসি :)
কোডএন্ডক্যাটস

সমাধান আমি চেয়েছিলাম।
মুরহফ সওসালি

5
মজার, আমি আশ্চর্য হয়েছি কেন টাইপস্ক্রিপ্ট ইতিমধ্যে এনাম স্ট্রিংগুলিকে সমর্থন করে না ... প্রচুর লোক এটি চায় (আমাকে অন্তর্ভুক্ত করা হয়েছে)।
হেন্ডি ইরওয়ান

23

টাইপস্ক্রিপ্ট 2.1 +

টাইপস্ক্রিপ্ট ২.১ এ প্রবর্তিত প্রকারের চেহারাগুলি স্ট্রিং এনামগুলিকে সিমুলেটেড করার জন্য অন্য একটি প্যাটার্নকে অনুমতি দেয়:

// String enums in TypeScript 2.1
const EntityType = {
    Foo: 'Foo' as 'Foo',
    Bar: 'Bar' as 'Bar'
};

function doIt(entity: keyof typeof EntityType) {
    // ...
}

EntityType.Foo          // 'Foo'
doIt(EntityType.Foo);   // 👍
doIt(EntityType.Bar);   // 👍
doIt('Foo');            // 👍
doIt('Bad');            // 🙁 

টাইপস্ক্রিপ্ট 2.4 +

সংস্করণ ২.৪ সহ, টাইপস্ক্রিপ্ট স্ট্রিং এনামগুলিতে স্থানীয় সমর্থন প্রবর্তন করেছিল, সুতরাং উপরের সমাধানটির প্রয়োজন নেই। টিএস ডক্স থেকে:

enum Colors {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}

এনাম কী নামটি যদি স্ট্রিং মানের থেকে আলাদা হয় (তবে এটি খুব দীর্ঘ, উদাহরণস্বরূপ) তবে আমি কীভাবে এটি করব?
CletusW

কিছু মনে করো না! নিচে 'থেকে @ Łukasz-pniewski মীমাংসিত গুলি উত্তর stackoverflow.com/a/42820134/1431146
CletusW

এনসকে বিপরীত-মানচিত্র করার চেষ্টা করার সময় tslint সেই স্ট্রিং-এনাম উদাহরণটিতে একটি ত্রুটি ফেলবে: এলিমেন্টটি স্পষ্টতই একটি 'কোনও' টাইপ করে কারণ সূচক এক্সপ্রেশনটি 'সংখ্যার' নয়। আমি সমস্যাটি হল এই যে হিজড়া স্ট্রিং Enums মধ্যে বিপরীত ম্যাপ হতে পারে না, এ স্ট্রিং-Enum উদাহরণে মন্তব্য দেখতে typescriptlang.org/docs/handbook/release-notes/... - এই হিজড়া 2.4 যেখানে সত্য হবে বলে মনে হয় স্ট্রিং-এনাম চালু হয়েছিল তবে আমি টিএস ২.6.২ এও ত্রুটি পেয়েছি। উদাহরণ: Colors["RED"]কাজ করবে না। এটি কীভাবে সমাধান করবেন তার কোনও ধারণা (জেএসএন রূপান্তরকরণের জন্য প্রয়োজনীয়)।
মাসি

19

কেন কেবল এনামের স্ট্রিংগুলি অ্যাক্সেস করার নেটিভ উপায়টি ব্যবহার করবেন না।

enum e {
  WHY,
  NOT,
  USE,
  NATIVE
}

e[e.WHY] // this returns string 'WHY'

2
আমি এই উত্তরটি খুঁজছিলাম, ধন্যবাদ! অন্যান্য সমাধানগুলি চতুর কর্মক্ষেত্র, তবে এটি এত সহজ :)
এম--

19
এটি প্রশ্নের উত্তর দেয় না। প্রশ্ন একটি এনামের স্ট্রিং অ্যাক্সেস সম্পর্কে নয়। enum Why { Because = "You Can't", Always = "Do Things That Way." };)
জেমস উইলকিন্স

সেখানে সমস্যা যখন সাংখ্যিক মান enums ব্যবহার করে, যেমন 0 falsy হচ্ছে, কঠিন ডিবাগ ইত্যাদি হয়
robmcm

@robmcm এনাম ই সমাধান করেছে {কেন = 1, নয় = 2, ইউএসই = 3, জাতীয় = 4} ই [ই। ডাব্লুওয়াই] // এই স্ট্রিংটি 'কেন'
মেন্ট-জান স্টেলিং

16

আপনি সর্বশেষ টাইপস্ক্রিপ্টে স্ট্রিং এনামগুলি ব্যবহার করতে পারেন:

enum e
{
    hello = <any>"hello",
    world = <any>"world"
};

সূত্র: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/


আপডেট - 2016

এই দিনগুলিতে আমি প্রতিক্রিয়ার জন্য ব্যবহার করেছি স্ট্রিংগুলির একটি সেট তৈরি করার কিছুটা শক্তিশালী উপায় এইরকম:

export class Messages
{
    static CouldNotValidateRequest: string = 'There was an error validating the request';
    static PasswordMustNotBeBlank: string = 'Password must not be blank';   
}

import {Messages as msg} from '../core/messages';
console.log(msg.PasswordMustNotBeBlank);

1
এটি আমার পক্ষে
কাজটিই

তবে এর সাথে একটি সমস্যা হ'ল এটি <string>e.helloএকটি ত্রুটি ট্রিগার করে trig e.helloসংকলক দ্বারা এখনও একটি সংখ্যা হিসাবে বিবেচনা করা হয়। <number>e.helloযদিও কাজ করে। এই কাছাকাছি কোন উপায় আছে? আমি যা ভাবতে পারি তা হ'ল <string><any>e.hello
রেনিংচেইন

আরেকটি বিষয় হ'ল এনাম সদস্যের সমান হওয়া মূল্য মূল্য হিসাবে সমান। প্রাক্তন:enum Test { a = <any>"b", b = <any>"c", c = <any>"a" } Test.a === 'c'
রেনিংচেইন

আমি এই পদ্ধতিটি সর্বদা ব্যবহার করি। স্ট্রিং এনুমের রক। এটি হতাশাজনক যে সংকলকটির স্ট্রিং আক্ষরিক জন্য প্রথম শ্রেণীর সমর্থন নেই, তবে এটিতে ২ য় শ্রেণির সমর্থন রয়েছে। সংকলকটি আসলে জানে যখন আপনি <নতুন> হ্যাকটি ব্যবহার করেছেন কারণ এটি আপনাকে একটি .d.ts ফাইলে ব্যবহার করা থেকে বিরত রাখবে - যে আমাকে এই "হ্যাক" ব্যবহারকে কিছুটা বৈধতা দেয় যেহেতু সংকলক স্পষ্টতই অবগত এটি কিন্তু এটি পুরোপুরি বন্ধ করে না।
কোডএন্ডক্যাটস

BTW, যদি আপনি একটি স্ট্রিং enum মান স্ট্রিং মান তুলনা, বরং তারপর কাস্ট চান <any>তারপর <string>শুধু একটি করুন:someStringValue == someEnumValue.toString()
CodeAndCats

10

এখানে একটি সম্পূর্ণ পরিষ্কার সমাধান যা টাইপসক্রিপ ২.০ ব্যবহার করে উত্তরাধিকারের অনুমতি দেয়। আমি এটি আগের সংস্করণে চেষ্টা করিনি।

বোনাস: মান যে কোনও প্রকারের হতে পারে !

export class Enum<T> {
  public constructor(public readonly value: T) {}
  public toString() {
    return this.value.toString();
  }
}

export class PrimaryColor extends Enum<string> {
  public static readonly Red = new Enum('#FF0000');
  public static readonly Green = new Enum('#00FF00');
  public static readonly Blue = new Enum('#0000FF');
}

export class Color extends PrimaryColor {
  public static readonly White = new Enum('#FFFFFF');
  public static readonly Black = new Enum('#000000');
}

// Usage:

console.log(PrimaryColor.Red);
// Output: Enum { value: '#FF0000' }
console.log(Color.Red); // inherited!
// Output: Enum { value: '#FF0000' }
console.log(Color.Red.value); // we have to call .value to get the value.
// Output: #FF0000
console.log(Color.Red.toString()); // toString() works too.
// Output: #FF0000

class Thing {
  color: Color;
}

let thing: Thing = {
  color: Color.Red,
};

switch (thing.color) {
  case Color.Red: // ...
  case Color.White: // ...
}

1
দুর্দান্ত উত্তর! আমি উত্তরাধিকারের সহায়তায় কিছু এনাম-জাতীয় বস্তু তৈরির জন্য সংগ্রাম করে যাচ্ছিলাম।
ড্যানিয়েলএম

ক্লাস-ভিত্তিক এনুম ব্যবহার করে একটি উদাহরণ: goo.gl/SwH4zb (টাইপস্ক্রিপ্টের খেলার মাঠের লিঙ্ক)।
ড্যানিয়েলএম

8

এর একটি হ্যাকি উপায়: -

CallStatus.ts

enum Status
{
    PENDING_SCHEDULING,
    SCHEDULED,
    CANCELLED,
    COMPLETED,
    IN_PROGRESS,
    FAILED,
    POSTPONED
}

export = Status

Utils.ts

static getEnumString(enum:any, key:any):string
{
    return enum[enum[key]];
}

ব্যবহারবিধি

Utils.getEnumString(Status, Status.COMPLETED); // = "COMPLETED"

7

এটি আমার পক্ষে কাজ করে:

class MyClass {
    static MyEnum: { Value1; Value2; Value3; }
    = {
        Value1: "Value1",
        Value2: "Value2",
        Value3: "Value3"
    };
}

অথবা

module MyModule {
    export var MyEnum: { Value1; Value2; Value3; }
    = {
        Value1: "Value1",
        Value2: "Value2",
        Value3: "Value3"
    };
}

8)

আপডেট: এটি পোস্ট করার অল্প সময়ের মধ্যেই আমি অন্য একটি উপায় আবিষ্কার করেছি, তবে একটি আপডেট পোস্ট করতে ভুলে গেছি (তবে ইতিমধ্যে উপরে এটি উল্লেখ করা হয়েছে):

enum MyEnum {
    value1 = <any>"value1 ", 
    value2 = <any>"value2 ", 
    value3 = <any>"value3 " 
}

4

আমি কেবল একটি ইন্টারফেস ঘোষণা করি এবং সেই ধরণের একটি ভেরিয়েবল এনাম অ্যাক্সেস করি। ইন্টারফেস এবং এনামকে সিঙ্কে রাখা আসলে সহজ, যেহেতু টাইপস্ক্রিপ্ট এনামের মতো কিছু পরিবর্তন করে তবে অভিযোগ করে।

ত্রুটি টিএস 2345: 'টাইপফুল EAbFlagEnum' টাইপের যুক্তি 'IAbFlagEnum' টাইপের প্যারামিটারে নির্ধারিত নয়। সম্পত্তি 'মুভ' প্রকারের 'টাইপফুল EAbFlagEnum' অনুপস্থিত।

এই পদ্ধতির সুবিধাটি হ'ল বিভিন্ন পরিস্থিতিতে এনাম (ইন্টারফেস) ব্যবহার করার জন্য কোনও ধরণের কাস্টিং প্রয়োজন হয় না, এবং আরও অনেক ধরণের পরিস্থিতি যেমন স্যুইচ / কেস হিসাবে সমর্থিত হয়।

// Declare a TypeScript enum using unique string 
//  (per hack mentioned by zjc0816)

enum EAbFlagEnum {
  None      = <any> "none",
  Select    = <any> "sel",
  Move      = <any> "mov",
  Edit      = <any> "edit",
  Sort      = <any> "sort",
  Clone     = <any> "clone"
}

// Create an interface that shadows the enum
//   and asserts that members are a type of any

interface IAbFlagEnum {
    None:   any;
    Select: any;
    Move:   any;
    Edit:   any;
    Sort:   any;
    Clone:  any;
}

// Export a variable of type interface that points to the enum

export var AbFlagEnum: IAbFlagEnum = EAbFlagEnum;

এনামের পরিবর্তে চলকটি ব্যবহার করা পছন্দসই ফলাফল দেয়।

var strVal: string = AbFlagEnum.Edit;

switch (strVal) {
  case AbFlagEnum.Edit:
    break;
  case AbFlagEnum.Move:
    break;
  case AbFlagEnum.Clone
}

পতাকাগুলি আমার জন্য অন্য প্রয়োজনীয়তা ছিল, তাই আমি একটি এনপিএম মডিউল তৈরি করেছি যা এই উদাহরণকে যুক্ত করে এবং এতে পরীক্ষাগুলিও অন্তর্ভুক্ত রয়েছে।

https://github.com/djabraham/ts-enum-tools


আমি একমাত্র উত্তর পেয়েছি যা আমদানির সাথে সংজ্ঞা সংশ্লেষ করতে দেয় allows নিস! আপনি export default EAbFlagEnum as IAbFlagEnum;কোনও ভেরিয়েবল পুনরায় ঘোষণার পরিবর্তে ব্যবহার করতে পারেন । আমি <any>এনামের কাস্টটিও সরিয়েছি , এটি ঠিক আছে।
গিলিয়াম এফ।

4

আপডেট: টাইপস্ক্রিপ্ট 3.4

আপনি কেবল ব্যবহার করতে পারেন as const:

const AwesomeType = {
   Foo: "foo",
   Bar: "bar"
} as const;

টাইপস্ক্রিপ্ট ২.১

এটিও এভাবে করা যেতে পারে। আশা করি এটি কারও সাহায্য করবে।

const AwesomeType = {
    Foo: "foo" as "foo",
    Bar: "bar" as "bar"
};

type AwesomeType = (typeof AwesomeType)[keyof typeof AwesomeType];

console.log(AwesomeType.Bar); // returns bar
console.log(AwesomeType.Foo); // returns foo

function doSth(awesometype: AwesomeType) {
    console.log(awesometype);
}

doSth("foo") // return foo
doSth("bar") // returns bar
doSth(AwesomeType.Bar) // returns bar
doSth(AwesomeType.Foo) // returns foo
doSth('error') // does not compile

এটাই আমার দরকার ছিল! আপনি আপনার বড় হাতের অক্ষর / ছোট হাতের পার্থক্যটি দেখিয়েছেন বলে মূল নামটি স্ট্রিং মান থেকে আলাদা হওয়া সমর্থন করে। ধন্যবাদ!
CletusW

2

কাস্টম ট্রান্সফর্মারগুলির সাথে ( https://github.com/Mic Microsoft/TypeScript/pull/13940) যা পরের টাইপস্ক্রিপ্টে উপলভ্য, আপনি স্ট্রিং আক্ষরিক প্রকারের স্ট্রিং মানগুলির সাথে এনামের মতো এনাম তৈরি করতে পারেন।

দয়া করে আমার এনপিএম প্যাকেজটি দেখুন, টিএস-ট্রান্সফর্মার-গণনা করুন

ব্যবহারের উদাহরণ:

// The signature of `enumerate` here is `function enumerate<T extends string>(): { [K in T]: K };`
import { enumerate } from 'ts-transformer-enumerate';

type Colors = 'green' | 'yellow' | 'red';
const Colors = enumerate<Colors>();

console.log(Colors.green); // 'green'
console.log(Colors.yellow); // 'yellow'
console.log(Colors.red); // 'red'

2

টাইপস্ক্রিপ্ট <2.4

/** Utility function to create a K:V from a list of strings */
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} {
  return o.reduce((res, key) => {
    res[key] = key;
    return res;
  }, Object.create(null));
}

/**
  * Sample create a string enum
  */

/** Create a K:V */
const Direction = strEnum([
  'North',
  'South',
  'East',
  'West'
])
/** Create a Type */
type Direction = keyof typeof Direction;

/** 
  * Sample using a string enum
  */
let sample: Direction;

sample = Direction.North; // Okay
sample = 'North'; // Okay
sample = 'AnythingElse'; // ERROR!

https://basarat.gitbooks.io/typescript/docs/tyype/literal-tyype.html থেকে

উত্স লিঙ্কে আপনি স্ট্রিং আক্ষরিক প্রকারটি সম্পাদন করার আরও ও সহজ উপায়গুলি পেতে পারেন


2

উত্তর অনেক আছে, কিন্তু আমি কোনও সম্পূর্ণ সমাধান দেখতে পাচ্ছি না। গৃহীত উত্তরের পাশাপাশি সমস্যাটি enum { this, one }হ'ল এটি হ'ল স্ট্রিংয়ের মানটিকে আপনি অনেকগুলি ফাইলের মাধ্যমে ব্যবহার করছেন। আমি সত্যিই "আপডেট" পছন্দ করি না, এটি জটিল এবং লিভারেজের ধরণগুলিও ভাল নয়। আমি মনে করি মাইকেল ব্রোমলের উত্তরটি সবচেয়ে সঠিক, তবে এটি ইন্টারফেসটি কিছুটা ঝামেলা এবং এটি একটি প্রকারের সাথে করতে পারে।

আমি টাইপস্ক্রিপ্ট ২.০ ব্যবহার করছি * * আমি কী করব তা এখানে

export type Greeting = "hello" | "world";
export const Greeting : { hello: Greeting , world: Greeting } = {
    hello: "hello",
    world: "world"
};

let greet: Greeting = Greeting.hello

সহায়ক আইডিই ব্যবহার করার সময় এটিতে আরও ভাল টাইপ / হোভার-ওভার তথ্য রয়েছে। ড্র ফিরে আপনি দুটি বার স্ট্রিং লিখতে হবে, কিন্তু কমপক্ষে এটি কেবল দুটি জায়গায়।


1

@ বাসরতের উত্তর দুর্দান্ত ছিল। এখানে সরলীকৃত তবে আপনি ব্যবহার করতে পারেন সামান্য বিস্তৃত উদাহরণ:

export type TMyEnumType = 'value1'|'value2';

export class MyEnumType {
    static VALUE1: TMyEnumType = 'value1';
    static VALUE2: TMyEnumType = 'value2';
}

console.log(MyEnumType.VALUE1); // 'value1'

const variable = MyEnumType.VALUE2; // it has the string value 'value2'

switch (variable) {
    case MyEnumType.VALUE1:
        // code...

    case MyEnumType.VALUE2:
        // code...
}

1

টাইপস্ক্রিপ্ট 1.0.1 দিয়ে সম্প্রতি এই সমস্যার মুখোমুখি হয়ে এইভাবে সমাধান করেছেন:

enum IEvents {
        /** A click on a product or product link for one or more products. */
        CLICK,
        /** A view of product details. */
        DETAIL,
        /** Adding one or more products to a shopping cart. */
        ADD,
        /** Remove one or more products from a shopping cart. */
        REMOVE,
        /** Initiating the checkout process for one or more products. */
        CHECKOUT,
        /** Sending the option value for a given checkout step. */
        CHECKOUT_OPTION,
        /** The sale of one or more products. */
        PURCHASE,
        /** The refund of one or more products. */
        REFUND,
        /** A click on an internal promotion. */
        PROMO_CLICK
}

var Events = [
        'click',
        'detail',
        'add',
        'remove',
        'checkout',
        'checkout_option',
        'purchase',
        'refund',
        'promo_click'
];

function stuff(event: IEvents):boolean {
        // event can now be only IEvents constants
        Events[event]; // event is actually a number that matches the index of the array
}
// stuff('click') won't work, it needs to be called using stuff(IEvents.CLICK)

0

আমার মনে হয় আপনার এটির সাথে চেষ্টা করা উচিত, এক্ষেত্রে ভেরিয়েবলের মান পরিবর্তন হবে না এবং এটি enums এর মতো কাজ করে, ক্লাসের মতো ব্যবহার করলেও একমাত্র অসুবিধা কাজ করে ভুলের দ্বারা আপনি স্থির ভেরিয়েবলের মান পরিবর্তন করতে পারেন এবং এটিই আমরা এনামগুলিতে চাই না।

namespace portal {

export namespace storageNames {

    export const appRegistration = 'appRegistration';
    export const accessToken = 'access_token';

  }
}


0
//to access the enum with its string value you can convert it to object 
//then you can convert enum to object with proberty 
//for Example :

enum days { "one" =3, "tow", "Three" }

let _days: any = days;

if (_days.one == days.one)
{ 
    alert(_days.one + ' | ' + _days[4]);
}


0

আপনি যা চান তা যদি প্রধানত সহজ ডিবাগ হয় (মোটামুটি টাইপ চেক সহ) এবং এনামের জন্য বিশেষ মান নির্দিষ্ট করার প্রয়োজন না হয় তবে আমি এটি করছি:

export type Enum = { [index: number]: string } & { [key: string]: number } | Object;

/**
 * inplace update
 * */
export function enum_only_string<E extends Enum>(e: E) {
  Object.keys(e)
    .filter(i => Number.isFinite(+i))
    .forEach(i => {
      const s = e[i];
      e[s] = s;
      delete e[i];
    });
}

enum AuthType {
  phone, email, sms, password
}
enum_only_string(AuthType);

আপনি যদি লিগ্যাসি কোড / ডেটা স্টোরেজ সমর্থন করতে চান তবে আপনি সংখ্যার কীগুলি রাখতে পারেন।

এইভাবে, আপনি দুটিবার মানগুলি এড়াতে পারবেন।


0

স্ট্রিং সহ খুব, খুব খুব সহজ এনুম (টাইপস্ক্রিপ্ট ২.৪)

import * from '../mylib'

export enum MESSAGES {
    ERROR_CHART_UNKNOWN,
    ERROR_2
}

export class Messages {
    public static get(id : MESSAGES){
        let message = ""
        switch (id) {
            case MESSAGES.ERROR_CHART_UNKNOWN :
                message = "The chart does not exist."
                break;
            case MESSAGES.ERROR_2 :
                message = "example."
                break;
        }
        return message
    }
}

function log(messageName:MESSAGES){
    console.log(Messages.get(messageName))
}

0

আমি নীচের মত টাইপস্ক্রিপ্ট 1.5 তে চেষ্টা করেছি এবং এটি আমার জন্য কাজ করেছে

module App.Constants {
   export enum e{
        Hello= ("Hello") as any,
World= ("World") as any
    }
}

0

আমি টাইপস্ক্রিপ্ট এনামগুলিতে (v2.5) বর্ণনা কার্যকর করার একটি উপায় খুঁজছিলাম এবং এই প্যাটার্নটি আমার পক্ষে কাজ করেছে:

export enum PriceTypes {
    Undefined = 0,
    UndefinedDescription = 'Undefined' as any,
    UserEntered = 1,
    UserEnteredDescription = 'User Entered' as any,
    GeneratedFromTrade = 2,
    GeneratedFromTradeDescription = 'Generated From Trade' as any,
    GeneratedFromFreeze = 3,
    GeneratedFromFreezeDescription = 'Generated Rom Freeze' as any
}

...

    GetDescription(e: any, id: number): string {
        return e[e[id].toString() + "Description"];
    }
    getPriceTypeDescription(price: IPricePoint): string {
        return this.GetDescription(PriceTypes, price.priceType);
    }

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