برنامه نویسی

استفاده از Typescript بدون کامپایل – DEV Community

طی چند روز گذشته، مقاله ای در مورد نسخه اصلی بعدی Svelte در توییتر منفجر شد و باعث بحث های زیادی شد. در مقاله آمده است:

این تیم در حال تغییر کد اصلی از TypeScript به JavaScript است.

که انصافاً کمی گمراه کننده است. از نظر فنی، مقاله اشتباه نیست، تیم است تغییر کد اصلی از TypeScript به JavaScript. با این حال، آنها چک کردن تایپ را از کد خود حذف نمی کنند. آنها فقط از نوشتن کد منبع TypeScript به طور مستقیم به نوشتن کد منبع جاوا اسکریپت با استفاده از JSDoc در ترکیب با .d.ts فایل ها. این به آنها اجازه می دهد:

  • کد typesafe را بنویسید، با TypeScript که چک کردن تایپ را انجام می دهد
  • جاوا اسکریپت ساده را بنویسید و ارسال کنید
  • مرحله کامپایل TypeScript را رد کنید
  • هنوز انواع را برای کاربران نهایی خود ارائه می دهد

نکته جالب در مورد این بحث این است که بسیاری از افراد این موضوع را پیدا کردند خیلی ناراحت کننده، و توییتر با بحث در مورد چک کردن تایپ منفجر شد. زمانی که تیم ESLint اعلام کرد که علاقه ای به استفاده از TypeScript برای بازنویسی ESLint خود ندارند، دقیقاً مشابه همین اتفاق افتاد، اما در عوض همان رویکردی را انتخاب کردند که تیم Svelte به دنبال آن است. جاوا اسکریپت ساده با JSDoc برای چک کردن تایپ. در این بحث‌های توییتری کاملاً مشخص شده است که بسیاری از مردم، حتی برخی از کسانی که خود را “آموزگار” می‌نامند، نمی‌دانند که JSDoc واقعاً چقدر توانایی دارد و متأسفانه فقط دروغ‌های آشکاری را در مورد این روش کار منتشر می‌کنند.

در اینجا لازم به ذکر است که هیچ یک از این تیم ها ایمنی نوع را نادیده نمی گیرند. آنها فقط روش دیگری را برای استفاده از ایمنی نوع انتخاب کردند، بدون اینکه نیازی به استفاده از مرحله کامپایل برای رسیدن به این هدف داشته باشند. این یک است ترجیح. هیچ جواب درست و غلطی وجود ندارد؛ با استفاده از TypeScript در هر دو روش، امنیت نوع را دریافت می کنید. این بحث و این تصمیم گیری ها مربوط نمی شود نه با استفاده از TypeScript و مگر اینکه مستقیماً روی هر یک از آن پروژه ها کار کنید یا در آن مشارکت داشته باشید، این تصمیمات شما را درگیر نمی کند. به صراحت گفته می شود که به شما ربطی ندارد. اگر شما می خواهید از TypeScript با یک مرحله کامپایل استفاده کنید. به دنبال آن برو! نیازی به دشمنی نیست این پروژه ها همچنان از TypeScript برای اطمینان از ایمنی نوع در کد خود استفاده می کنند و همچنان می توانند انواع را برای کاربران نهایی خود ارسال کنند. در این وبلاگ نگاهی به مزایای پرش از مرحله تدوین TypeScripts می اندازیم، برخی از افسانه هایی را که در اطراف دیده ام روشن می کنیم و بر اهمیت درک و احترام به اولویت ها و روش های مختلف تأکید می کنیم.

در این وبلاگ، من به جزئیات در مورد نحوه تنظیم پروژه خود برای فعال کردن چک کردن تایپ با JSDoc نمی پردازم، منابع بسیار خوبی مانند این اینجا وجود دارد.

قبل از غواصی، می خواهم یک بار دیگر تکرار کنم که استفاده از انواع از طریق JSDoc به افراد اجازه می دهد هنوز با استفاده از تایپ اسکریپت تایپ اسکریپت جاوا اسکریپت را بنویسید. فقط از مرحله تالیف می گذرد. شما همچنین می توانید همچنان استفاده کنید .d.ts در صورت لزوم (اما شما مجبور نیستید!) فایل کنید، و انواعی را برای کاربران خود تهیه کنید. و بله، این رویکرد هنوز از TypeScript استفاده می کند.

مزایای نادیده گرفتن مرحله تدوین

مراحل کامپایل یا ترجمه در اکوسیستم ابزار جاوا اسکریپت اغلب کمی یک شر ضروری هستند، مانند انتقال JSX، یا در این مورد کد TypeScript. آنها اغلب به آن سرعتی که ما می‌خواهیم نیستند، و اغلب در پیکربندی کمی دست و پنجه نرم می‌کنند (اگرچه باید توجه داشت که ابزارهای زیادی در سال‌های اخیر بهبود یافته‌اند) تا راه‌اندازی شما به خوبی کار کند. نه تنها برای ساختن پروژه های خود برای تولید، بلکه برای تنظیم درست همه چیز برای محیط توسعه محلی شما و همچنین اجرای آزمایشی شما. در حالی که کامپایل یا ترجمه تسهیلاتی را ارائه می دهد (نوشتن کد منبع JSX، به جای فراخوانی های React.createElement به صورت دستی، یا نوشتن انواع در کد منبع شما به طور مستقیم)، برخی افراد این مراحل کامپایل را نامطلوب می دانند و ترجیح می دهند در صورت امکان از آنها صرف نظر کنند.

پرش از یک مرحله کامپایل، در زمینه استفاده از TypeScript، چندین مزیت دارد. این باعث می شود کد شما در زمان اجرا آگنوستیک باشد. کد شما در Node، Deno، مرورگر، محیط‌های Worker-like و غیره اجرا می‌شود. برخی از این محیط‌ها، مانند Deno، از اجرای TypeScript به صورت بومی پشتیبانی می‌کنند (که مجموعه‌ای از پیامدهای نگران‌کننده دیگر دارد). برخی از این محیط‌ها، مانند مرورگر، این کار را نمی‌کنند (تا زمانی که انواع پیشنهادات نظرات به هر حال فرود نیاید). این ممکن است بسته به چیزی که می سازید برای شما مشکل ساز باشد یا نباشد، اما باز هم، برخی افراد این را ترجیح می دهند.

اگر کد شما در زمان اجرا آگنوستیک است، همچنین به شما این امکان را می دهد که به راحتی تکه های کد را کپی و در REPL ها جایگذاری کنید. ارسال جاوا اسکریپت بومی نیز اشکال زدایی را ساده می کند، به مثال زیر توجه کنید: شما بسته خود را به عنوان جاوا اسکریپت بومی ارسال کرده اید. شخصی بسته شما را نصب می کند و یک اشکال را کشف می کند. آنها فقط می توانند وارد node_modules خود شوند و به راحتی برخی از کدها را تغییر دهند تا سعی کنند باگ را برطرف کنند، بدون اینکه با کدهای ترجمه شده، نقشه های منبع و غیره سروکار داشته باشند.

یک مزیت اضافی از استفاده از JSDoc که من شخصاً پیدا کردم (این یک اولویت شخصی)، این است که مانع مستندسازی کد من در مقایسه با TypeScript بسیار کمتر است. به مثال زیر توجه کنید:

یک تابع endraw خام «add» ایجاد می‌شود، هنگام تایپ خام «/**» endraw، ویرایشگر کد داربست را برای انواع آن تکمیل می‌کند و مستندات به تابع اضافه می‌شود.

مسلماً تابعی به نام add احتمالاً به اسناد زیادی نیاز ندارد، اما برای اهداف تصویری.

وقتی تایپ میکنم /**<ENTER> در صفحه کلید من، ویرایشگر من قبلاً نظر JSDoc را برای من داربست خواهد داد، فقط باید انواع خود را بنویسم. توجه داشته باشید که نوع بازگشتی را می توان حذف کرد، زیرا TypeScript همچنان به درستی نوع بازگشتی را از کد استنتاج می کند. در حالی که من قبلاً نظر JSDoc را در اینجا دارم، ممکن است اسنادی برای آن اضافه کنم! Easypeasy.

اسطوره ها

استفاده از JSDoc قابل نگهداری نیست

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

./types.d.ts:

export interface User {
  username: string,
  age: number
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و آن را در کد منبع خود وارد کنید:
./my-function.js:

/**
 * @typedef {import('./types').User} User
 */

/**
 * @param {User}
 */
function foo(user) {}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بدون استنتاج نوع یا هوشمندانه

به نظر می رسد برخی افراد فکر می کنند که استفاده از JSDoc به نوعی باعث از دست دادن استنتاج نوع شما می شود. همانطور که قبلا در بالا نشان داده شد، این نیز درست نیست. به مثال زیر توجه کنید:

نوع بازگشتی تابع endraw «add» خام به درستی استنباط می شود

به نظر می رسد دلیل این ادعا این است که مردم متوجه نمی شوند که وقتی از JSDoc برای انواع استفاده می کنید، شما هنوز از تایپ اسکریپت استفاده می کنید. TypeScript است هنوز انجام دادن تایپ کردن.

نوشتن دستی انواع آزاردهنده است

برخی افراد ادعا کردند که نوشتن انواع دستی آزاردهنده است. من فقط می توانم حدس بزنم که این یک مورد ترجیحی است، یا شاید برای آن افراد روشن نیست که هنوز می توانید .d.ts فایل ها. برخی افراد ترجیح خواهند داد example B بر فراز example A. این خوبه. هر دو را می توان هنگام استفاده از JSDoc برای انواع استفاده کرد.

example A:

/**
 * @typedef {Object} User
 * @property {string} username
 * @property {number} age
 */
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

example B:

export interface User {
  username: string,
  age: number
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما همچنان از TypeScript استفاده می کند!

بله، این نکته است.

در نتیجه

در نهایت، و من در اینجا خودم را تکرار می کنم، استفاده از TypeScript بدون کامپایل کردن کد شما یک a ترجیح. هیچ پاسخ درست یا غلطی وجود ندارد و من هر کسی را که به این رویکرد بدبین است دعوت می‌کنم که کمی بازتر باشد و زمانی که پروژه جدیدی را شروع می‌کنید آن را امتحان کنید، ممکن است متوجه شوید که این رویکرد بسیار خوبی است. استفاده از انواع و اگر در نهایت آن را دوست ندارید، این نیز خوب است!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا