আমি একটি টাইপসক্রিপ্ট একটি enum
টাইপ পুনরাবৃত্তি করতে এবং প্রতিটি গণিত প্রতীক নাম পেতে চাই: যেমন:
enum myEnum { entry1, entry2 }
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
আমি একটি টাইপসক্রিপ্ট একটি enum
টাইপ পুনরাবৃত্তি করতে এবং প্রতিটি গণিত প্রতীক নাম পেতে চাই: যেমন:
enum myEnum { entry1, entry2 }
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
উত্তর:
আপনার পোস্ট করা কোডটি কাজ করবে; এটি এনাম সদস্যদের মান সহ এনামের সমস্ত সদস্যকে মুদ্রণ করবে। উদাহরণস্বরূপ, নিম্নলিখিত কোড:
enum myEnum { bar, foo }
for (var enumMember in myEnum) {
console.log("enum member: ", enumMember);
}
নিম্নলিখিত মুদ্রণ করবে:
Enum member: 0
Enum member: 1
Enum member: bar
Enum member: foo
পরিবর্তে যদি আপনি কেবল সদস্যের নাম এবং মানগুলি না চান তবে আপনি এরকম কিছু করতে পারেন:
for (var enumMember in myEnum) {
var isValueProperty = parseInt(enumMember, 10) >= 0
if (isValueProperty) {
console.log("enum member: ", myEnum[enumMember]);
}
}
এটি কেবল নামগুলি মুদ্রণ করবে:
এনাম সদস্য: বার
এনাম সদস্য: foo
Caveat: এটি সামান্য একটি বাস্তবায়ন বিশদের উপর নির্ভর করে: টাইপস্ক্রিপ্ট একটি জেএস বস্তুতে এনামকে বস্তুর সদস্য হিসাবে মানগুলি সংকলন করে। ভবিষ্যতে টিএস এগুলি আলাদাভাবে প্রয়োগ করার সিদ্ধান্ত নিলে উপরের কৌশলটি ভেঙে যেতে পারে।
+enumMember >= 0
হওয়া উচিত isFinite(+enumMember)
কারণ নেতিবাচক বা ভাসমান পয়েন্টের মানগুলিও বিপরীত ম্যাপযুক্ত হয়। ( খেলার মাঠ )
যদিও উত্তর ইতিমধ্যে সরবরাহ করা হয়েছে, প্রায় কেউই ডক্সের দিকে নির্দেশ করেনি
এখানে একটি স্নিপেট
enum Enum {
A
}
let nameOfA = Enum[Enum.A]; // "A"
মনে রাখবেন যে স্ট্রিং এনাম সদস্যরা মোটেই উত্পন্ন বিপরীত ম্যাপিং পান না।
0
বা 1
এই enum থেকে? export enum Octave { ZERO = 0, ONE = 1 }
enum Enum {"A"}; let nameOfA = Enum[Enum.A];
?
ধরে নিচ্ছি যে আপনি বিধিগুলিকে অবিচল রয়েছেন এবং কেবল সংখ্যাসূচক মানগুলির সাথে এনাম তৈরি করেন, আপনি এই কোডটি ব্যবহার করতে পারেন। এটি সঠিকভাবে সেই ক্ষেত্রে পরিচালনা করে যেখানে আপনার একটি নাম রয়েছে যা কাকতালীয়ভাবে একটি বৈধ সংখ্যা
enum Color {
Red,
Green,
Blue,
"10" // wat
}
var names: string[] = [];
for(var n in Color) {
if(typeof Color[n] === 'number') names.push(n);
}
console.log(names); // ['Red', 'Green', 'Blue', '10']
আমার জন্য কী চলছে তা বোঝার একটি সহজ, ব্যবহারিক এবং প্রত্যক্ষ উপায়, এটি হল নিম্নোক্ত গণনা:
enum colors { red, green, blue };
এটিতে মূলত রূপান্তরিত হবে:
var colors = { red: 0, green: 1, blue: 2,
[0]: "red", [1]: "green", [2]: "blue" }
এই কারণে, নিম্নলিখিতটি সত্য হবে:
colors.red === 0
colors[colors.red] === "red"
colors["red"] === 0
এটি নিম্নরূপে একটি নামকরণের একটি সহজ উপায় তৈরি করে:
var color: colors = colors.red;
console.log("The color selected is " + colors[color]);
স্ট্রিংটিকে একটি এনুমুরেটেড ভ্যালুতে রূপান্তর করার জন্য এটি একটি দুর্দান্ত উপায় তৈরি করে।
var colorName: string = "green";
var color: colors = colors.red;
if (colorName in colors) color = colors[colorName];
উপরের দুটি পরিস্থিতি অনেক বেশি সাধারণ পরিস্থিতি, কারণ সাধারণত আপনি একটি নির্দিষ্ট মানের নাম এবং জেনেরিক উপায়ে মানকে সিরিয়ালাইজ করার ক্ষেত্রে আরও বেশি আগ্রহী হন।
আপনি যদি কেবলমাত্র নামগুলি অনুসন্ধান করেন এবং পরে ব্যবহারটি পুনরাবৃত্তি করেন:
Object.keys(myEnum).map(key => myEnum[key]).filter(value => typeof value === 'string') as string[];
Object.values(myEnum).filter(value => typeof value === 'string') as string[];
Object.values(myEnum).filter(value => typeof value === 'string').map(key => { return {id: myEnum[key], type: key }; });
বর্তমান টাইপস্ক্রিপ্ট সংস্করণ 1.8.9 সহ আমি টাইপ করা এনাম ব্যবহার করি:
export enum Option {
OPTION1 = <any>'this is option 1',
OPTION2 = <any>'this is option 2'
}
এই জাভাস্ক্রিপ্ট অবজেক্টে ফলাফল সহ:
Option = {
"OPTION1": "this is option 1",
"OPTION2": "this is option 2",
"this is option 1": "OPTION1",
"this is option 2": "OPTION2"
}
সুতরাং আমাকে কী এবং মানগুলির মাধ্যমে জিজ্ঞাসা করতে হবে এবং কেবল মানগুলি ফেরত দিতে হবে:
let optionNames: Array<any> = [];
for (let enumValue in Option) {
let optionNameLength = optionNames.length;
if (optionNameLength === 0) {
this.optionNames.push([enumValue, Option[enumValue]]);
} else {
if (this.optionNames[optionNameLength - 1][1] !== enumValue) {
this.optionNames.push([enumValue, Option[enumValue]]);
}
}
}
এবং আমি একটি অ্যারেতে বিকল্প কীগুলি পেয়েছি:
optionNames = [ "OPTION1", "OPTION2" ];
টাইপস্ক্রিপ্ট ২.৪ অনুসারে, এনামগুলিতে স্ট্রিং অন্তর্নিবিষ্টদের থাকতে পারে https://www.typescriptlang.org.org/docs/handbook/release-notes/tyypecript-2-4.html
এটি আপনাকে লিখতে দেয়:
enum Order {
ONE = "First",
TWO = "Second"
}
console.log(`One is ${Order.ONE.toString()}`);
এবং এই আউটপুট পান:
একটি ফার্স্ট
এখানে পাওয়া অন্য একটি আকর্ষণীয় সমাধানটি ES6 মানচিত্রটি ব্যবহার করছে:
export enum Type {
low,
mid,
high
}
export const TypeLabel = new Map<number, string>([
[Type.low, 'Low Season'],
[Type.mid, 'Mid Season'],
[Type.high, 'High Season']
]);
ব্যবহারের
console.log(TypeLabel.get(Type.low)); // Low Season
আসুন ts-enum-util
( গিথুব , এনপিএম ) আপনার জন্য কাজটি করতে দিন এবং প্রচুর অতিরিক্ত টাইপ-সেফ ইউটিলিটি সরবরাহ করুন। উভয় স্ট্রিং এবং সংখ্যাসূচক এনামগুলির সাথে কাজ করে, সংখ্যাসূচক এনামগুলির জন্য সংখ্যার সূচক বিপরীত লুকে প্রবেশের সঠিকভাবে উপেক্ষা করে:
স্ট্রিং এনাম:
import {$enum} from "ts-enum-util";
enum Option {
OPTION1 = 'this is option 1',
OPTION2 = 'this is option 2'
}
// type: ("OPTION1" | "OPTION2")[]
// value: ["OPTION1", "OPTION2"]
const keys= $enum(Option).getKeys();
// type: Option[]
// value: ["this is option 1", "this is option 2"]
const values = $enum(Option).getValues();
সংখ্যাযুক্ত এনাম:
enum Option {
OPTION1,
OPTION2
}
// type: ("OPTION1" | "OPTION2")[]
// value: ["OPTION1", "OPTION2"]
const keys= $enum(Option).getKeys();
// type: Option[]
// value: [0, 1]
const values = $enum(Option).getValues();
টাইপস্ক্রিপ্ট ২.৪ থেকে শুরু করে, এনামটিতে সদস্য হিসাবে আর কী থাকবে না। টাইপস্ক্রিপ্ট রিডমি থেকে উত্স
সতর্কবাণীটি হ'ল স্ট্রিং-ইনিশিয়ালড এনামগুলিকে আসল এনাম সদস্যের নাম পেতে বিপরীত-ম্যাপ করা যায় না। অন্য কথায়, আপনি "লাল" স্ট্রিংটি পেতে রঙগুলি ["RED"] লিখতে পারবেন না।
আমার সমাধান:
export const getColourKey = (value: string ) => {
let colourKey = '';
for (const key in ColourEnum) {
if (value === ColourEnum[key]) {
colourKey = key;
break;
}
}
return colourKey;
};
enum-values
আমার যখন একই সমস্যা হয়েছিল তখন আপনি যে প্যাকেজটি লিখেছিলেন তা আপনি ব্যবহার করতে পারেন :
var names = EnumValues.getNames(myEnum);
উপরের কিছু উত্তরের উপর ভিত্তি করে আমি এই ধরণের-নিরাপদ ফাংশন স্বাক্ষর নিয়ে এসেছি:
export function getStringValuesFromEnum<T>(myEnum: T): keyof T {
return Object.keys(myEnum).filter(k => typeof (myEnum as any)[k] === 'number') as any;
}
ব্যবহার:
enum myEnum { entry1, entry2 };
const stringVals = getStringValuesFromEnum(myEnum);
ধরণ stringVals
হল'entry1' | 'entry2'
(keyof T)[]
পরিবর্তে ফিরে আসা উচিত keyof T
। এছাড়াও, export
আপনার খেলার মাঠকে কাজ করা বন্ধ করে দেয়।
দেখে মনে হচ্ছে যে এখানে কোনও উত্তর-মোডে স্ট্রিং-এনামগুলির সাথে কাজ করবে না strict
।
এনাম হিসাবে বিবেচনা করুন:
enum AnimalEnum {
dog = "dog", cat = "cat", mouse = "mouse"
}
এটি দিয়ে অ্যাক্সেস করা হচ্ছে AnimalEnum["dog"]
ফলে এমন ত্রুটি হতে পারে:
Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 'typeof AnimalEnum'.ts(7053)
।
এই ক্ষেত্রে উপযুক্ত সমাধান, এটি লিখুন:
AnimalEnum["dog" as keyof typeof AnimalEnum]
keyof
সাথে ব্যবহারের জন্য উজ্জ্বল সমাধান typeof
! অন্যান্য সমাধানটি বেশ অস্বচ্ছ বলে মনে হচ্ছে তবে সর্বোপরি আমি মনে করি টাইপস্রিপ্টের জন্য ডিএক্স-তে উন্নতি রাখা দরকার
টাইপস্ক্রিপ্ট ডকুমেন্টেশন অনুসারে, আমরা স্থির ফাংশন সহ এনামের মাধ্যমে এটি করতে পারি।
স্ট্যাটিক ফাংশন সহ এনাম নাম পান
enum myEnum {
entry1,
entry2
}
namespace myEnum {
export function GetmyEnumName(m: myEnum) {
return myEnum[m];
}
}
now we can call it like below
myEnum.GetmyEnumName(myEnum.entry1);
// result entry1
স্ট্যাটিক ফাংশন সহ এনাম সম্পর্কে আরও পড়ার জন্য নীচের লিঙ্কটি অনুসরণ করুন https://basarat.gitbooks.io/typescript/docs/enums.html
সমস্ত ক্ষেত্রে আমার জন্য একমাত্র সমাধানটি কার্যকর হয় (মানগুলি স্ট্রিং হলেও এমনকি) :
var enumToString = function(enumType, enumValue) {
for (var enumMember in enumType) {
if (enumType[enumMember]==enumValue) return enumMember
}
}
পুরানো প্রশ্ন, কিন্তু, কেন কোনও const
বস্তুর মানচিত্র ব্যবহার করবেন না ?
এটি করার পরিবর্তে:
enum Foo {
BAR = 60,
EVERYTHING_IS_TERRIBLE = 80
}
console.log(Object.keys(Foo))
// -> ["60", "80", "BAR", "EVERYTHING_IS_TERRIBLE"]
console.log(Object.values(Foo))
// -> ["BAR", "EVERYTHING_IS_TERRIBLE", 60, 80]
এটি করুন ( as const
অভিনেতাদের দিকে মনোযোগ দিন ):
const Foo = {
BAR: 60,
EVERYTHING_IS_TERRIBLE: 80
} as const
console.log(Object.keys(Foo))
// -> ["BAR", "EVERYTHING_IS_TERRIBLE"]
console.log(Object.values(Foo))
// -> [60, 80]
console.log(Object.keys(Foo))
প্রথম উদাহরণে কেবল ফিরে আসে ["BAR", "EVERYTHING_IS_TERRIBLE"]
..
["60", "80", "BAR", "EVERYTHING_IS_TERRIBLE"]
আমি "টাইপস্ক্রিপ্ট পুনরায় পুনরায় এনাম কীগুলি" অনুসন্ধান করে এই প্রশ্নটি পেয়েছি। সুতরাং আমি কেবল সমাধান পোস্ট করতে চাই যা আমার ক্ষেত্রে আমার পক্ষে কাজ করে। হতে পারে এটি কারও পক্ষেও সহায়তা করবে।
আমার কেসটি নিম্নরূপ: আমি প্রতিটি এনাম কীতে পুনরাবৃত্তি করতে চাই, তারপরে কয়েকটি কী ফিল্টার করতে চাই, তারপরে এমন কিছু বস্তুর অ্যাক্সেস করতে পারি যার এনুম থেকে গুণিত মান হিসাবে কী রয়েছে। সুতরাং কোনও টিএস ত্রুটি না করেই আমি এটি করি।
enum MyEnum = { ONE = 'ONE', TWO = 'TWO' }
const LABELS = {
[MyEnum.ONE]: 'Label one',
[MyEnum.TWO]: 'Label two'
}
// to declare type is important - otherwise TS complains on LABELS[type]
// also, if replace Object.values with Object.keys -
// - TS blames wrong types here: "string[] is not assignable to MyEnum[]"
const allKeys: Array<MyEnum> = Object.values(MyEnum)
const allowedKeys = allKeys.filter(
(type) => type !== MyEnum.ONE
)
const allowedLabels = allowedKeys.map((type) => ({
label: LABELS[type]
}))
আমি একটি এনামুটিল ক্লাস লিখেছিলাম যা এনাম মান অনুসারে একটি পরীক্ষা করে নিচ্ছে:
export class EnumUtils {
/**
* Returns the enum keys
* @param enumObj enum object
* @param enumType the enum type
*/
static getEnumKeys(enumObj: any, enumType: EnumType): any[] {
return EnumUtils.getEnumValues(enumObj, enumType).map(value => enumObj[value]);
}
/**
* Returns the enum values
* @param enumObj enum object
* @param enumType the enum type
*/
static getEnumValues(enumObj: any, enumType: EnumType): any[] {
return Object.keys(enumObj).filter(key => typeof enumObj[key] === enumType);
}
}
export enum EnumType {
Number = 'number',
String = 'string'
}
এটি কিভাবে ব্যবহার করতে:
enum NumberValueEnum{
A= 0,
B= 1
}
enum StringValueEnum{
A= 'A',
B= 'B'
}
EnumUtils.getEnumKeys(NumberValueEnum, EnumType.number);
EnumUtils.getEnumValues(NumberValueEnum, EnumType.number);
EnumUtils.getEnumKeys(StringValueEnum, EnumType.string);
EnumUtils.getEnumValues(StringValueEnum, EnumType.string);
সংখ্যাভালিউইনাম কীগুলির ফলাফল: ["এ", "বি"]
নাম্বারভ্যালিউম মানগুলির জন্য ফলাফল: [0, 1]
স্ট্রিংভ্যালিউউনামকিসের ফলাফল: ["এ", "বি"]
স্ট্রিংভ্যালিউউনামালুয়েসের ফলাফল: ["এ", "বি"]
আমি সেই সমাধানটিকে আরও মার্জিত বলে মনে করি:
for (let val in myEnum ) {
if ( isNaN( parseInt( val )) )
console.log( val );
}
এটি প্রদর্শিত হয়:
bar
foo
আমার এনুম এরকম:
export enum UserSorting {
SortByFullName = "Sort by FullName",
SortByLastname = "Sort by Lastame",
SortByEmail = "Sort by Email",
SortByRoleName = "Sort by Role",
SortByCreatedAt = "Sort by Creation date",
SortByCreatedBy = "Sort by Author",
SortByUpdatedAt = "Sort by Edit date",
SortByUpdatedBy = "Sort by Editor",
}
সুতরাং এই রিটার্ন অপরিশোধিত করছেন :
UserSorting[UserSorting.SortByUpdatedAt]
এই সমস্যাটি সমাধান করার জন্য, আমি পাইপ ব্যবহার করে এটি করার আরও একটি উপায় বেছে নিয়েছি:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'enumKey'
})
export class EnumKeyPipe implements PipeTransform {
transform(value, args: string[] = null): any {
let enumValue = args[0];
var keys = Object.keys(value);
var values = Object.values(value);
for (var i = 0; i < keys.length; i++) {
if (values[i] == enumValue) {
return keys[i];
}
}
return null;
}
}
এবং এটি ব্যবহার করতে:
return this.enumKeyPipe.transform(UserSorting, [UserSorting.SortByUpdatedAt]);
আপনার যদি এনাম থাকে
enum Diet {
KETO = "Ketogenic",
ATKINS = "Atkins",
PALEO = "Paleo",
DGAF = "Whatever"
}
তারপরে আপনি কী এবং মানগুলি পেতে পারেন:
Object.keys(Diet).forEach((d: Diet) => {
console.log(d); // KETO
console.log(Diet[d]) // Ketogenic
});
Argument of type '(d: Diet) => void' is not assignable to parameter of type '(value: string, index: number, array: string[]) => void'. Types of parameters 'd' and 'value' are incompatible. Type 'string' is not assignable to type 'MyEnum'.(2345)
আমি একটি এনাম গণনা করার জন্য একটি সহায়ক ফাংশন লিখেছিলাম:
static getEnumValues<T extends number>(enumType: {}): T[] {
const values: T[] = [];
const keys = Object.keys(enumType);
for (const key of keys.slice(0, keys.length / 2)) {
values.push(<T>+key);
}
return values;
}
ব্যবহার:
for (const enumValue of getEnumValues<myEnum>(myEnum)) {
// do the thing
}
ফাংশনটি এমন কিছু প্রত্যাবর্তন করে যা সহজেই গণনা করা যায় এবং এনামের ধরণে কাস্ট করে।
একটি বর্তমান সংস্করণ টাইপস্ক্রিপ্ট ব্যবহার করে আপনি এনামকে আপনার পছন্দসই একটি রেকর্ডে মানচিত্র করতে এই জাতীয় ফাংশন ব্যবহার করতে পারেন। নোট করুন যে আপনি এই ফাংশনগুলির সাথে স্ট্রিং মানগুলি সংজ্ঞায়িত করতে পারবেন না কারণ তারা কোনও সংখ্যার মান সহ কীগুলি সন্ধান করে।
enum STATES {
LOGIN,
LOGOUT,
}
export const enumToRecordWithKeys = <E extends any>(enumeration: E): E => (
Object.keys(enumeration)
.filter(key => typeof enumeration[key] === 'number')
.reduce((record, key) => ({...record, [key]: key }), {}) as E
);
export const enumToRecordWithValues = <E extends any>(enumeration: E): E => (
Object.keys(enumeration)
.filter(key => typeof enumeration[key] === 'number')
.reduce((record, key) => ({...record, [key]: enumeration[key] }), {}) as E
);
const states = enumToRecordWithKeys(STATES)
const statesWithIndex = enumToRecordWithValues(STATES)
console.log(JSON.stringify({
STATES,
states,
statesWithIndex,
}, null ,2));
// Console output:
{
"STATES": {
"0": "LOGIN",
"1": "LOGOUT",
"LOGIN": 0,
"LOGOUT": 1
},
"states": {
"LOGIN": "LOGIN",
"LOGOUT": "LOGOUT"
},
"statesWithIndex": {
"LOGIN": 0,
"LOGOUT": 1
}
}
এখানে ইতিমধ্যে প্রচুর উত্তর রয়েছে তবে আমি অনুভব করি যে আমি আমার সমাধানটি স্ট্যাকের মধ্যে ফেলে দেব।
enum AccountType {
Google = 'goo',
Facebook = 'boo',
Twitter = 'wit',
}
type Key = keyof typeof AccountType // "Google" | "Facebook" | "Twitter"
// this creates a POJO of the enum "reversed" using TypeScript's Record utility
const reversed = (Object.keys(AccountType) as Key[]).reduce((acc, key) => {
acc[AccountType[key]] = key
return acc
}, {} as Record<AccountType, string>)
স্বচ্ছতার জন্য:
/*
* reversed == {
* "goo": "Google",
* "boo": "Facebook",
* "wit": "Twitter",
* }
* reversed[AccountType.Google] === "Google" 👍
*/
টাইপস্ক্রিপ্ট রেকর্ডের জন্য রেফারেন্স
একটি দুর্দান্ত সহায়ক ফাংশন:
const getAccountTypeName = (type: AccountType) => {
return reversed[type]
};
// getAccountTypeName(AccountType.Twitter) === 'Twitter'
এটি আপনার প্রশ্নের সঠিক উত্তর নয় তবে এটি আপনার সমস্যার সমাধান করার কৌশল।
export module Gender {
export enum Type {
Female = 1,
Male = 2
};
export const List = Object.freeze([
Type[Type.Female] ,
Type[Type.Male]
]);
}
আপনি নিজের তালিকা মডেলটি আপনার পছন্দ মতো প্রসারিত করতে পারেন।
export const List = Object.freeze([
{ name: Type[Type.Female], value: Type.Female } ,
{ name: Type[Type.Male], value: Type.Male }
]);
এখন, আপনি এটি এইভাবে ব্যবহার করতে পারেন:
for(const gender of Gender.List){
console.log(gender.name);
console.log(gender.value);
}
বা:
if(i === Gender.Type.Male){
console.log("I am a man.");
}
getAllEnumValues
এবংgetAllEnumKeys
আপনার প্রয়োজনে