টাইপস্ক্রিপ্টে এনামগুলিতে চারটি ভিন্ন দিক রয়েছে যা সম্পর্কে আপনার সচেতন হওয়া দরকার। প্রথমত, কিছু সংজ্ঞা:
"অনুসন্ধান অবজেক্ট"
আপনি যদি এই এনাম লিখেন:
enum Foo { X, Y }
টাইপস্ক্রিপ্ট নিম্নলিখিত বস্তু নির্গত করবে:
var Foo;
(function (Foo) {
Foo[Foo["X"] = 0] = "X";
Foo[Foo["Y"] = 1] = "Y";
})(Foo || (Foo = {}));
আমি এটিকে লুকিং অবজেক্ট হিসাবে উল্লেখ করব । এর উদ্দেশ্য দ্বিগুণ: স্ট্রিং থেকে সংখ্যাগুলিতে ম্যাপিং হিসাবে পরিবেশন করা , যেমন লেখার সময় Foo.X
বা Foo['X']
, এবং সংখ্যার থেকে স্ট্রিংয়ের ম্যাপিং হিসাবে পরিবেশন করা । ডিবাগিং বা লগিংয়ের উদ্দেশ্যে সেই বিপরীত ম্যাপিংটি কার্যকর - আপনার প্রায়শই মান থাকবে 0
বা 1
আপনি সংশ্লিষ্ট স্ট্রিংটি পেতে চান "X"
বা "Y"
।
"ঘোষণা" বা " পরিবেষ্টিত "
টাইপস্ক্রিপ্টে, আপনি কম্পাইলারের যে জিনিসগুলি সম্পর্কে জানতে হবে সেগুলি "ঘোষণা" করতে পারেন, তবে আসলে কোডটি নির্গত নয় not আপনার কাছে jQuery এর মতো লাইব্রেরি রয়েছে যখন কিছু বস্তুর সংজ্ঞা দেয় (উদাহরণস্বরূপ $
) যেগুলি সম্পর্কে আপনি টাইপ তথ্য চান তবে সংকলক দ্বারা তৈরি কোনও কোডের প্রয়োজন হয় না This অনুমান এবং অন্যান্য ডকুমেন্টেশনগুলি "পরিবেষ্টিত" প্রসঙ্গে হিসাবে এইভাবে করা ঘোষণাকে বোঝায়; এটি নোট করা গুরুত্বপূর্ণ যে কোনও .d.ts
ফাইলের সমস্ত ঘোষণাগুলি "পরিবেষ্টিত" (হয় স্পষ্টত পরিবর্তনকারী প্রয়োজন হয় declare
বা এটি স্পষ্টতই তা হ'ল, ঘোষণার ধরণের উপর নির্ভর করে)।
"ইনলাইনিং"
পারফরম্যান্স এবং কোড আকারের কারণে, প্রায়শই একটি সংখ্যার সমতুল্য সংকলন করার সময় এনাম সদস্যের প্রতিস্থাপন করা ভাল pre
enum Foo { X = 4 }
var y = Foo.X; // emits "var y = 4";
কল্পনাটি এই প্রতিস্থাপনটিকে কল করে , আমি এটিকে ইনলাইনিং বলব কারণ এটি শীতল শোনায়। কখনও কখনও আপনি এনাম সদস্যদের অন্তর্ভুক্ত করাতে চান না , উদাহরণস্বরূপ, কারণ এনামের মান এপিআইয়ের ভবিষ্যতের সংস্করণে পরিবর্তিত হতে পারে।
এনামস, তারা কীভাবে কাজ করবে?
একটি এনামের প্রতিটি দিক দিয়ে এটি ভাঙা যাক। দুর্ভাগ্যক্রমে, এই চারটি বিভাগের প্রতিটি অন্যের থেকে শর্তাবলী রেফারেন্সে চলেছে, সুতরাং আপনার সম্ভবত এই পুরো জিনিসটি একাধিকবার পড়তে হবে।
গণিত বনাম অ-গণিত (ধ্রুবক)
এনাম সদস্যদের হয় হয় গণনা করা যেতে পারে বা না। অনুমানটি অ-গণিত সদস্যদের অবিচ্ছিন্নভাবে কল করে তবে কনস্টের সাথে বিভ্রান্তি এড়াতে আমি তাদেরকে অ-গণিত বলব ।
একটি গণিত এনাম সদস্য এমন একজন যার মূল্য সংকলন সময়ে জানা যায় না। গণিত সদস্যদের উল্লেখগুলি অবশ্যই ইনলাইন করা যায় না। উল্টোদিকে, অ কম্পিউটেড enum সদস্য যার মানকে একবার হয় কম্পাইল-সময়ে পরিচিত। অ-গণিত সদস্যদের রেফারেন্সগুলি সর্বদা অন্তর্ভুক্ত থাকে।
কোন এনুম সদস্যগণ গণিত হয় এবং কোনটি অ-গণিত হয়? প্রথমে, const
এনামের সমস্ত সদস্য স্থির থাকে (যেমন অ-গণিত), নামটি বোঝা যায়। নন-কনস্ট্যান্ট এনুমের জন্য এটি নির্ভর করে আপনি কোনও অ্যাম্বিয়েন্ট (ঘোষিত) এনাম বা অ-অ্যাম্বিয়েন্ট এনাম খুঁজছেন কিনা whether
কোনও declare enum
(যেমন পরিবেষ্টিত এনাম) এর সদস্য স্থির থাকে এবং কেবল যদি এর ইনিশিয়ালাইজার থাকে। অন্যথায়, এটি গণনা করা হয়। নোট করুন যে declare enum
একটিতে, শুধুমাত্র সংখ্যাগত প্রারম্ভিকদের অনুমতি দেওয়া হয়। উদাহরণ:
declare enum Foo {
X, // Computed
Y = 2, // Non-computed
Z, // Computed! Not 3! Careful!
Q = 1 + 1 // Error
}
অবশেষে, অ-ঘোষিত নন-কনস্ট্যান্ট এনামগুলির সদস্যগণ সর্বদা গণনা হিসাবে বিবেচিত হয়। যাইহোক, তাদের আরম্ভকরণের অভিব্যক্তিগুলি স্থিরকারীদের কমিয়ে আনা হয় যদি তারা সংকলন সময়ে গণনীয় হয়। এর অর্থ নন-কনস্ট্যান্ট এনাম সদস্যরা কখনই ইনলাইন হয় না (এই আচরণটি টাইপস্ক্রিপ্ট ১.৫ এ পরিবর্তিত হয়েছে, নীচে "টাইপসক্রিপ্টে পরিবর্তনগুলি দেখুন")
কনট বনাম নন-কনস্ট্যান্ট
const
একটি এনাম ঘোষণায় const
পরিবর্তক থাকতে পারে। একটি enum হয় তাহলে const
, সব তার সদস্যদের উল্লেখ inlined।
const enum Foo { A = 4 }
var x = Foo.A; // emitted as "var x = 4;", always
সংকলিত এনামগুলি একটি সংক্ষিপ্ত বিবরণ তৈরি করে না। এই কারণে, Foo
সদস্যের রেফারেন্সের অংশ ব্যতীত উপরের কোডটিতে রেফারেন্স করা একটি ত্রুটি । Foo
রানটাইমের সময় কোনও বস্তু উপস্থিত থাকবে না।
অ const
যদি এনাম ঘোষণাপত্রে const
সংশোধক না থাকে তবে সদস্য অ-গণনা করা হয় তবেই তার সদস্যদের রেফারেন্সগুলি ইনলাইন করা হয়। একটি অ-কনস্ট্যান্ট, অ-ঘোষিত এনাম একটি লুকিং অবজেক্ট তৈরি করবে।
ঘোষিত (পরিবেষ্টক) বনাম অ-ঘোষিত
একটি গুরুত্বপূর্ণ উপস্থাপনাটি হ'ল declare
টাইপস্ক্রিপ্টের একটি খুব নির্দিষ্ট অর্থ রয়েছে: এই বস্তুটি অন্য কোথাও বিদ্যমান । এটি বিদ্যমান বস্তুগুলি বর্ণনা করার জন্য । ব্যবহার declare
যে বস্তু আসলে উপস্থিত না থাকার খারাপ পরিণাম হতে পারে সংজ্ঞায়িত করতে; আমরা পরে এটি অন্বেষণ করব।
ঘোষণা
A declare enum
একটি লুকিং অবজেক্টকে ছাড়বে না। এই সদস্যদের গণনা করা হলে এর সদস্যদের রেফারেন্সগুলি ইনলাইন করা হয় (উপরের দিকে গণিত বনাম অ-গণিত দেখুন)।
এটা খেয়াল করা জরুরী একটি রেফারেন্স যে অন্যান্য ধরনের গুরুত্বপূর্ণ declare enum
হয় মঞ্জুরিপ্রাপ্ত যেমন এই কোড না একটি কম্পাইল এরর কিন্তু হবে রানটাইম এ ব্যর্থ:
// Note: Assume no other file has actually created a Foo var at runtime
declare enum Foo { Bar }
var s = 'Bar';
var b = Foo[s]; // Fails
এই ত্রুটিটি "সংকলককে মিথ্যা বলবেন না" বিভাগের অধীনে আসে। Foo
রানটাইমের সময় যদি আপনার কোনও নাম না থাকে তবে লিখবেন না declare enum Foo
!
ক - declare const enum
এ - এর থেকে আলাদা নয় - const enum
প্রিফারিজ কনস্টেইনামসের ক্ষেত্রে (নীচে দেখুন)।
অ ঘোষণা
একটি অ-ঘোষিত এনাম যদি তা না থাকে তবে একটি লুকিং অবজেক্ট তৈরি করে const
। ইনলাইনিং উপরে বর্ণিত হয়।
--preservConstEnums পতাকা
এই পতাকাটির ঠিক এক প্রভাব রয়েছে: অ-ঘোষিত কনস্ট এনামগুলি একটি লুকিং অবজেক্টটি প্রেরণ করবে। ইনলাইনিং প্রভাবিত হয় না। এটি ডিবাগিংয়ের জন্য দরকারী।
সাধারণ ত্রুটি
সর্বাধিক সাধারণ ভুলটি হ'ল declare enum
কোনও নিয়মিত ব্যবহার করা enum
বা const enum
আরও উপযুক্ত be একটি সাধারণ ফর্মটি হ'ল:
module MyModule {
// Claiming this enum exists with 'declare', but it doesn't...
export declare enum Lies {
Foo = 0,
Bar = 1
}
var x = Lies.Foo; // Depend on inlining
}
module SomeOtherCode {
// x ends up as 'undefined' at runtime
import x = MyModule.Lies;
// Try to use lookup object, which ought to exist
// runtime error, canot read property 0 of undefined
console.log(x[x.Foo]);
}
সুবর্ণ নিয়ম মনে রাখবেন: কখনও declare
কিছু যে আসলে কোন অস্তিত্ব নেই । ব্যবহার করুন const enum
যদি আপনি সবসময় ইনলাইনিং চাই, বা enum
আপনি লুকআপ বস্তুর চান।
টাইপস্ক্রিপ্ট পরিবর্তন
টাইপস্ক্রিপ্ট 1.4 এবং 1.5 এর মধ্যে, অ-ঘোষিত নন-কনস্ট্যান্ট এনামগুলির সমস্ত সদস্যকে গণনা হিসাবে বিবেচনা করার জন্য , আচরণের পরিবর্তন হয়েছে ( https://github.com/Mic Microsoft/TypeScript/issues/2183 দেখুন ) তারা স্পষ্টভাবে একটি আক্ষরিক সঙ্গে আরম্ভ করা হয়। এই "বাচ্চাকে আনস্প্লিট করুন", তাই কথা বলার জন্য, অন্তর্নিহিত আচরণটি আরও অনুমানযোগ্য এবং আরও পরিষ্কারভাবে ধারণাটিকে const enum
নিয়মিত থেকে পৃথক করে তোলে enum
। এই পরিবর্তনের আগে, নিরপেক্ষ এনামগুলির অ-গণিত সদস্যরা আরও আক্রমণাত্মকভাবে ইনলাইন হয়েছিল।