تایپ Enum و Any در تایپ اسکریپت

27 اسفند 1398
تایپ Enum و Any در تایپ اسکریپت

تایپ Enum در تایپ اسکریپت

یکی از مفاهیمی که در تایپ اسکریپت وجود دارد، نوعی از داده ها هستند که حالتی دو گانه دارند (شبیه Tuple ها). این نوع داده ها معمولا برای انتساب مقداری عددی به کار گرفته می شوند که همراه خود مقداری رشته ای برای خوانده شدن توسط انسان ها دارند و به آن ها Enum گفته می شود. Enum ها در بسیاری از زبان های برنامه نویسی موجود هستند اما در جاوا اسکریپت به آن ها دسترسی نداریم.

برای نوشتن یک Enum باید از ساختار زیر استفاده کنید:

Enum name {NEW, OLD}

برای تمرین امروز از همان مثال جلسه ی قبل استفاده می کنیم:

const person = {
  name: 'Maximilian',
  age: 30,
  hobbies: ['Sports', 'Cooking'],
  role: [2, 'author']
};

من می خواهم role را تغییر بدهم. فرض کنید برای role (نقش کاربر در سایت) سه سطح ادمین، نویسنده و خواننده (کاربران عادی) داشته باشیم. حالا می خواهیم برای هر کدام از این نقش ها یک مقدار عددی داشته باشیم تا در کد ها از آن استفاده کنیم: ادمین عدد صفر، کاربر عادی عدد 1 و نویسنده عدد 2.

سوال: چرا اعداد را به صورت عادی اضافه نکنیم؟ مثلا در قالب یک آرایه؟

پاسخ: به دلیل اینکه مشکلات احتمالی ما زیاد می شوند. مثلا ممکن است عددی را اضافه کنیم که در سیستم تعریف نشده باشد (مثلا سطح 4 که وجود ندارد). مثال دیگر کار خود ما است. اگر اعداد را به صورت عادی در یک آرایه قرار دهیم، در هنگام توسعه باید مرتبا چک کنیم که هر سطح دسترسی برای چه کسی بود.

معمولا افراد تازه کار سعی می کنند برای خواناتر شدن کد از اعداد دوری کنند و از رشته هایی مثل Admin یا ReadOnly-User استفاده کنند اما مشکل اینجاست که در هنگام کدنویسی مثلا در شرط های if یادشان می رود که مقدار تعریف شده Read-only-user بود یا read_only_user یا ReadOnlyUser یا... . به همین خاطر معمولا در جاوا اسکریپت از ثابت ها استفاده می شود، مثلا:

const ADMIN = 'ADMIN';
const USER = 'READ-ONLY-USER';
const AUTHOR = 3;

سپس از همین ثابت ها به جای نوشتن رشته استفاده می شود. این روش، روش مناسبی است اما هنوز هم احتمال می رود که به اشتباه مقداری غیرمعتبر در آن ها وارد کنیم چرا که مثلا در کد بالا AUTHOR نوع داده ی number را دارد بنابراین می توانیم هر عددی را به جای آن قرار دهیم!

حالا فرض کنید بخواهیم برای همین حالت یک enum بنویسیم:

enum Role { ADMIN = 'ADMIN', READ_ONLY = 100, AUTHOR = 'AUTHOR' };

معمولا در قراردادهای کدنویسی می گویند که نام enum باید با حرف بزرگ شروع شود (Role) و همچنین مقادیر درون آن باید همگی با حروف بزرگ نوشته شوند (READ_ONLY و...). همانطور که می بینید می توانید از اعداد و رشته ها و هر چه دلتان خواست استفاده بکنید، دقیقا مثل آرایه ها.

همچنین توجه داشته باشید که مثال بالا را می توانیم به شکل زیر نیز بنویسیم:

enum Role { ADMIN, READ_ONLY, AUTHOR };

در این حالت از index به عنوان مقدار استفاده می شود، یعنی ADMIN برابر با صفر، READ_ONLY برابر با یک و AUTHOR برابر با 2 خواهد بود اما اگر خواستید مقداری غیر از index های پیش فرض استفاده کنید که عددی هستند، می توانید از مثال بالا استفاده کنید و خودتان مقادیر دلخواهتان را به آن بدهید.

همچنین اگر فقط برای مقدار اول عدد جداگانه ای تعریف کنید، Enum از همانجا شروع می شود:

enum Role { ADMIN = 5, READ_ONLY, AUTHOR };

در اینجا تعیین کرده ام که ADMIN برابر 5 باشد بنابراین مقدار READ_ONLY برابر شش و مقدار AUTHOR برابر هفت می شود. یعنی مقداردهی از عدد اول شروع می شود. توجه داشته باشید که نام هر کدام از این موارد (مثل ADMIN) یک نوع label است یعنی فقط برای کار در کد از آن استفاده می کنیم. مثلا در کد بالا ADMIN برابر 5 است بنابراین هر جا که از Role.ADMIN استفاده کنیم عدد 5 به ما داده می شود نه رشته ی ADMIN. این موضوع می تواند در حالت رشته ای باعث اشتباه شما شود.

ما می توانیم برای استفاده از آن در قالب یک مثال بگوییم:

enum Role { ADMIN, READ_ONLY, AUTHOR };

const person = {
  name: 'Maximilian',
  age: 30,
  hobbies: ['Sports', 'Cooking'],
  role: Role.ADMIN
};

سپس برای امتحان کردن کد ها می توان گفت:

if (person.role === Role.AUTHOR) {
  console.log('is author');
}

از آنجایی که بالاتر برای role مقدار Role.ADMIN را تعیین کرده بودیم دستور console.log نباید اجرا شود و اگر به مرورگر برویم، چیزی مشاهده نخواهم کرد. چرا؟ چون ADMIN با AUTHOR یکی نیست و شرط غلط است.

در ضمن همانطور که گفتم Enum ها فقط در تایپ اسکریپت هستند و در جاوا اسکریپت وجود خارجی ندارند بنابراین اگر دستور tsc app.ts را اجرا کرده و به فایل app.js بروید، به سادگی متوجه تفاوت ها می شوید:

var Role;
(function (Role) {
    Role["ADMIN"] = "ADMIN";
    Role[Role["READ_ONLY"] = 100] = "READ_ONLY";
    Role["AUTHOR"] = "AUTHOR";
})(Role || (Role = {}));
;
var person = {
    name: 'Maximilian',
    age: 30,
    hobbies: ['Sports', 'Cooking'],
    role: Role.ADMIN
};

همانطور که می بینید پیاده سازی کد ساده ی ما در جاوا اسکریپت پیچیده و زمان بر است و این یکی از زیبایی های زبان تایپ اسکریپت می باشد که کار ما را بسیار راحت تر می کند.

تایپ Any در تایپ اسکریپت

همانطور که می دانید Any به معنی «هر چیزی» است بنابراین اگر این تایپ را به هر متغیری بدهید، یعنی اجازه داده اید که هر مقدار در آن قرار بگیرد. به مثال زیر دقت کنید:

let favoriteActivities: any;

متغیر favoriteActivities می تواند هر مقداری را بگیرد و هیچ مشکلی نخواهد داشت. استفاده از Any زیاد توصیه نمی شود چرا که مزایای تایپ اسکریپت را از ما می گیرد. حداقل می توانیم به جای گفتن any بگوییم:

let favoriteActivities: any[];

در این حالت حداقل می گوییم یک آرایه است که هر مقداری را درون خود قبول می کند تا کمی محدودتر شده باشیم. Any توضیحات خاصی ندارد و واقعا به همین سادگی است. توجه داشته باشید که اکثر برنامه نویسان توصیه می کنند که تا حد ممکن از Any دوری کنید مگر اینکه فعلا ندانید قرار است یکی از متغیرهایتان چه مقداری بگیرد. در چنین شرایطی می توانید موقتا از any استفاده کنید تا به خطا برنخورید و سپس در آینده برگشته و تایپ صحیح را برایش انتخاب کنید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش جامع تایپ اسکریپت توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Kouroshjs
03 مهر 1402
خیلی ممنونم بابت زحمتی که کشیدید. کلی یاد گرفتم تا به اینجای کار

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

mahdi
08 شهریور 1400
سلام خیلی ممنون آموزش خوبی بود دمتون گرم . به نظرتون اینجور مواقع اینو let favoriteActivities: any[]; این طوری بزنیم خوب نیست ؟ const x : (number|string)[] = [64,"dvj",142]

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مقالات مرتبط
ما را دنبال کنید
اینستاگرام روکسو تلگرام روکسو ایمیل و خبرنامه روکسو