آیا JavaScript در حال تبدیل شدن به TypeScript است؟

آفلاین
user-avatar
عرفان حشمتی
19 خرداد 1400, خواندن در 11 دقیقه

امروزه استفاده از وب به طرز چشمگیری افزایش یافته، به طوری که افراد روزانه بیش از 6 ساعت از وقت خود را صرف وبگردی و فعالیت‌های آنلاین می‌کنند. این افزایش استفاده منجر به تقاضای مشاغل توسعه وب شده است، زیرا شرکت‌ها به دنبال ایجاد بستری برای حضور خود به صورت آنلاین هستند. اگر نگاهی به تاریخچه شکل گیری وب بیندازید، کاملا واضح است که javascript نقش مهمی در موفقیت آن داشته است. اگرچه javascript برای ایجاد یک وب سایت ضروری نیست، اما بدون آن هم شما هیچ نوع تعاملی نخواهید داشت. اما با پیشرفت‌های اخیر، typescript  محبوبیت گسترده‌ای در بین توسعه دهندگان فعلی وب پیدا کرده است. ولی هنوز هم مجموعه عظیمی از توسعه دهندگان وجود دارند که ترجیح می‌دهند از javascript به جای typescript استفاده کنند.

قبل از بررسی موشکافانه، ابتدا بیایید نگاهی مختصر به javascript و typescript بیاندازیم.

JavaScript

javascript یک زبان برنامه نویسی است که می‌تواند برای ایجاد تعامل با وب مورد استفاده قرار گیرد. همچنین از آن به عنوان لایه سوم فناوری‌های استاندارد وب یاد می‌شود. اگر هنوز یادگیری آن را آغاز نکرده‌اید، به شما توصیه می‌کنیم هر چه سریع‌تر کار را شروع کنید. ضمنا می‌توانید آموزش کامل javascript را دنبال کنید.

یکی از نکات مهم در مورد هر زبان برنامه نویسی از جمله javascript این است که به طور مرتب با ویژگی‌های جدید به روز می‌شود. این نسخه‌ها در حالی منتشر می‌شوند که ECMAScript با جدیدترین به روزرسانی پایدار، نسخه ES2020 را در ژوئن سال 2020 منتشر کرده است.

TypeScript

typescript یک زبان برنامه نویسی متن باز است که توسط مایکروسافت توسعه یافته و در javascript کامپایل می‌شود. از زمان انتشار در سال 2012، این زبان همچنان در حال توسعه به صورت فعال است و هر ساله محبوبیت بیشتری پیدا می‌کند.

جامعه توسعه در روزهای ابتدایی به شدت آن را با فریمورک انگولار مرتبط کرد. دلیل آن این بود که انگولار شما را مجبور به استفاده از typescript می‌کند، هرچند این مسئله غالبا امکان پذیر است.

TypeScript اکنون چقدر محبوب است؟

typescript در سال‌های اخیر محبوبیت گسترده‌ای پیدا کرده و افزایش محبوبیت آن بسیار حیرت انگیز است؛ زیرا به عنوان زبانی که مدت نه چندان زیادی حضور داشته، توانسته به رتبه 4 صعود کند. آنچه تعجب آور است این است که TS در سال 2019 در جایگاه 7 قرار داشت. این نشان می‌دهد 3 رتبه در یک سال افزایش یافته که قابل توجه است.

بیشترین استفاده از زبان‌های برنامه نویسی

ترند گوگل برای typescript طی 5 سال گذشته

اگرچه این شاهکار شگفت انگیز است، اما از اکوسیستم javascript که برای چندین سال مداوم توسط Octoverse به عنوان پرکاربردترین زبان رتبه بندی می‌شد، فاصله زیادی دارد.

ترند گوگل برای typescript و javascript – javascript رنگ قرمز است

همانطور که الیوت می‌گوید، typescript را می‌توان یک موج واقعا بزرگ در اقیانوسی بسیار بزرگتر از JS دانست.

مشاهدات

اگر هر دوی این زبان‌های برنامه نویسی را با دقت مشاهده کنید، متوجه خواهید شد که برخی از ویژگی‌های جدید معرفی شده توسط javascript قبلا توسط typescript پیاده سازی شده‌اند. اگرچه نمی‌توان آن را به عنوان کپی در نظر گرفت، اما این احتمال وجود دارد که typescript بر روی javascript تأثیر گذاشته تا ویژگی‌هایی را پیدا کند که بیشتر مورد توجه توسعه دهندگان هستند.

آدام در مصاحبه‌ای گفت: «javascript روز به روز ویژگی‌های typescript را از آن خود می‌کند. با این حال من شک دارم که بتواند همه ویژگی‌های آن را به دست آورد."

گفته‌های آدام کاملا درست است. در حقیقت اگر javascript نوع ایستا را معرفی کند، می‌توان گفت که ماهیتش را تغییر داده است، در حالی که همیشه یک زبان پویا بوده است.

بیایید نگاهی به برخی از این ویژگی‌های javascript بیندازیم که ممکن است تحت تأثیر typescript قرار گرفته باشند.

کلاس‌ها

باید توجه داشته باشید که javascript سنتی از کلاس‌ها پشتیبانی نمی‌کند. ارث بری با کمک مفهومی به نام "Prototypal Inheritance" امکان پذیر شده است.

از طرفی typescript اجازه استفاده از کلاس‌ها را می‌دهد. این در javascript کامپایل می‌شود که می‌تواند در تمام مرورگرها و سیستم‌عامل‌های اصلی قابل اجرا باشد.

بعد از اینکه TS کلاس‌ها را معرفی کرد، JS نیز مفهوم کلاس‌ها را در نسخه ES6 خود قرار داد. توجه کنید که این ویژگی فقط در سینتکس برقرار است. کلاس‌های ES6 سینتکسی برای ارث بری javascript هستند و این ویژگی javascript را به یک زبان برنامه نویسی شی گرا تبدیل نمی‌کند.

با دانستن اینکه پیشنهاد استاندارد ECMAScript فعلی نوید پشتیبانی از برنامه نویسی کلاس در javascript را در آینده می‌دهد، بنابراین می‌توانید نتیجه بگیرید که TS می‌دانست که JS سرانجام سینتکس "کلاس" را دریافت خواهد کرد و بر اساس آن عمل می‌کند. این ممکن است یک سناریوی تأثیرگذاری معمولی نباشد.

Optional Chaining

این یک ویژگی مفید بود که قبلا در typescript در سال 2019 موجود بود. اما یک سال طول کشید تا کاربران javascript همان ویژگی را دریافت کنند. این ویژگی برای javascript در ES2020 منتشر شد.

زنجیره اختیاری یک ویژگی است که به شما امکان می‌دهد با خیال راحت به خصوصیات تودرتوی یک شی دسترسی پیدا کنید، بدون اینکه نیاز به بررسی وجود هر یک از آنها داشته باشید. این ویژگی از عملگر ?. برای دسترسی به خصوصیات اشیا استفاده می‌کند که بسیار شبیه به کاربرد عملگر . می‌باشد. اما هنگامی که مرجع تعریف نشده یا تهی است، به جای پرتاب خطا undefined را برمی‌گرداند.

این امر منجر به کد ساده‌تر و تمیزتری می‌شود که تضمین می‌کند هنگام کار با اشیا با خصوصیات نامشخص هیچ خطایی رخ نخواهد داد.

Nullish Coalescing

TypeScript 3.7 در انتشار 2019 خود این ویژگی را معرفی کرد. به دنبال آن javascript همین ویژگی را در ES2020 همراه با optional chaining منتشر کرد. به نظر می‌رسد که javascript از typescript در مورد اینکه چگونه می‌تواند ویژگی‌های جدیدتری را برای کاربران خود فراهم کنند، ایده می‌گیرد.

Nullish Coalescing به شما امکان می‌دهد تا به جای مقادیر false، مقادیر null را بررسی کنید. مقادیر null مقادیری هستند که یا تهی اند و یا تعریف نشده. در حالی که مقادیر false، مقادیری مانند رشته‌های خالی، عدد صفر، مقدار تعریف نشده، تهی، نادرست، و ... هستند. این ممکن است برای شما تفاوت زیادی نداشته باشد، اما در واقعیت معنی زیادی دارد.

متغیرهای Private

هنگامی که با سینتکس کلاس آشنا شدیم که برای ایجاد حس شی گرایی به ما معرفی شد، ما توسعه دهندگان خواهان ویژگی‌های OOP بیشتری شدیم.

در نهایت ما را به دنبال متغیرهای خصوصی در javascript سوق داد. اما قبل از اینکه javascript این ویژگی را منتشر کند، typescript این نوع متغیرها را منتشر کرد. این متغیرها مشابه سایر زبان‌های شی گرا با استفاده از کلمه کلیدی "private" تعریف می‌شوند.

بعدها javascript متغیرهای private خود را ارائه داد. اینها هنوز هم در مرحله پیشنهاد TC39 هستند اما انتظار می‌رود خیلی زود منتشر شوند. در مقابل استفاده typescript از متغیرهای خصوصی، javascript از نماد "#" به عنوان شناسه متغیرهای خصوصی استفاده کرد.

با این پیشنهاد، typescript در نسخه 3.8 پشتیبانی از این رویكرد خصوصی javascript را منتشر كرد. بعد از این، توسعه دهندگان این اختیار را داشتند که هر یک از این گزینه‌ها را که بخواهند انتخاب کنند. همچنین نوعی سردرگمی در مورد اینکه کدام یک بهتر است به وجود آمد. تیم typescript نظرات خود را در مورد این سردرگمی بیان کرده:

وقتی نوبت به خصوصیات می‌رسد، مادیفایرهای private typescript به طور کامل پاک می‌شوند. این بدان معناست که در زمان اجرا، کاملا مانند یک ویژگی بومی عمل می‌کند و هیچ راهی وجود ندارد که بگوییم با یک مادیفایر private تعریف شده است. هنگام استفاده از کلمه کلیدی private، دسترسی فقط در زمان کامپایل اعمال می‌شود و برای مصرف کنندگان javascript کاملا هدفمند است.

نکته مثبت این است که این نوع دسترسی می‌تواند به مصرف کنندگان شما کمک کند به طور موقت به برخی از APIها دسترسی نداشته باشند، اما در هر زمان از اجرا کار کند.

از طرف دیگر، این ویژگی ECMAScript در خارج از کلاس کاملا غیرقابل دسترسی است. همچنین برای اطمینان کامل از اینکه هیچ کس نمی‌تواند از اجزای داخلی شما استفاده کند بسیار مفید است. اگر نویسنده کتابخانه هستید، حذف یا تغییر نام یک قسمت خصوصی هرگز نباید باعث ایجاد تغییرات جدی شود.

دکوراتورها

دکوراتور یک ویژگی مفید است و مدت زمان طولانی است که از آن استفاده می‌شود. اگر با انگولار آشنایی داشته باشید، متوجه می‌شوید که "Component@" در کامپوننت‌های سازنده شما وجود دارد. به همین ترتیب، تعداد بیشتری از این نمادهای عجیب و غریب مانند “@Injectable” و “@Directive” و موارد دیگری را خواهید یافت. این اصطلاحات عجیب و غریب دکوراتور نامیده می‌شوند.

مدتی است که آنها در typescript وجود دارند. گرچه دکوراتورهای تابع از مدت‌ها قبل در javascript وجود داشته اند و از سینتکس خاصی استفاده نمی‌کنند. اما javascript هنوز این ویژگی را به صورت بومی منتشر نکرده است.

با این حال، یک پیشنهاد جدید در TC39 وجود دارد که از نماد "@" برای شناسایی دکوراتورها استفاده کند. به همین دلیل، typescript این ویژگی را همچنان آزمایشی اعلام کرده و از شما می‌خواهد فلگ‌ها را فعال یا tsconfig.json خود را اصلاح کنید.

پیش بینی‌های آینده

Interface

یکی از ویژگی‌های معرفی شده توسط typescript که در تلاش برای تبدیل javascript به زبانی دوستانه‌تر است، "interface" بود. این ویژگی در درجه اول در زبان‌های شی گرا برای دستیابی به انتزاع استفاده شده‌اند.

javascript هنوز به طور بومی از رابط‌ها پشتیبانی نمی‌کند. همچنین باید توجه داشته باشید که javascript با ارث بری بر اساس کلاس‌ها کار نمی‌کند بلکه بیشتر بر روی اشیا متمرکز است. همانطور که قبلا اشاره کردیم، معرفی کلمه کلیدی "class" برای ایجاد حس استفاده از کلاس‌ها بود.

توسعه دهندگان javascript این ویژگی را با مفهومی به نام "Duck Typing" پیاده سازی می‌کنند. همچنین کتابخانه‌هایی وجود دارند که برای پیاده سازی این ویژگی ایجاد شده‌اند مانند implement.js.

اگرچه این تکنیک‌ها را می‌توان به عنوان راه حل‌های مناسب در نظر گرفت، اما اجرای این ویژگی به صورت بومی بسیار خوب خواهد بود. تیم javascript می‌تواند رویکرد مشابهی را در مورد نحوه اجرای کلاس‌ها و پیاده سازی رابط‌ها به عنوان سینتکسی برای "Duck Typing" دنبال کند.

Namespace

این همچنین یک ویژگی است که در typescript معرفی شده که بسیار مفید به نظر می‌رسد. این ویژگی مشابه فضای نام در سی شارپ و پکیج‌های جاوا است.

به گفته ادی: "فضای نام را می‌توان یک گروه منطقی از واحدهای کد تحت یک شناسه منحصر به فرد دانست که این شناسه را می‌توان در بسیاری از فضاهای نامی ارجاع داد و هر شناسه می‌تواند خود حاوی یک سلسله مراتب از فضاهای نامی تو در تو (یا فرعی) باشد."

مشابه رابط‌ها، هیچ راح حل بومی برای پیاده سازی فضاهای نام در javascript وجود ندارد. بنابراین چندین الگوی طراحی با کمک اشیا و کلوزرها برای اجرای این ویژگی مورد نیاز در برنامه‌های javascript استفاده شد.

اگرچه ممکن است این موضوع مورد پسند ترین ویژگی قرار نگیرد، اما من معتقدم تیم JS می‌تواند آن را بدون دردسر فراهم کند.

جمع بندی

typescript و javascript نسبت به اوایل کار خود بسیار پیشرفت کرده‌اند. اما برای اینکه آنها به رشد ادامه دهند، ضروری است که ویژگی‌های مورد نیاز را به جامعه توسعه دهندگان ارائه دهند، صرف نظر از اینکه چه کسی آن را برای اولین بار معرفی می‌کند.

همچنین لازم به ذکر است که پیاده سازی ویژگی‌های خاص برای typescript به دلیل ماهیت کامپایل آسان‌تر است. به عنوان مثال، کلمات کلیدی "private" فقط در زمان کامپایل بررسی می‌شوند و این امکان را برای کسی ایجاد می‌کند که بعدا با این متغیرها سر و کار داشته باشد. اما وقتی javascript قابلیت خاصی را پیاده سازی می‌کند، مزیتی برای انجام هر نوع پردازش در زمان کامپایل ندارد، زیرا این یک زبان تفسیر شده است.

چه ویژگی‌های دیگری را سراغ دارید که فکر می‌کنید javascript از typescript الهام گرفته یا به عبارت دیگر تحت تأثیر آن قرار گرفته است؟ نظرات خود را در بخش زیر به اشتراک بگذارید.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
عرفان حشمتی @heshmati74
مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو