TypeScript باگهای احمقانه را پیش از رسیدن به مرحله تولید (production) شناسایی میکند. این ابزار برای ویژگیهای غلط املایی، آرگومانهای فراموششده و شاخههایی که ساختار اشتباهی برمیگردانند، شما را توبیخ میکند. شما آن را اصلاح میکنید، بیلد (build) با موفقیت انجام میشود و محصول را عرضه میکنید. اما تایپهای استاتیک محدودیت سختی دارند. به محض اینکه کامپایلر کار خود را تمام کند، تمام اعلانها (annotations) حذف میشوند. موتور JavaScript که کد شما را اجرا میکند، هرگز چیزی درباره interfaceها، branded types یا string literalsهایی که با دقت محدود کردهاید، نشنیده است. این موتور فقط مقادیر و قوانین واقعی زبان را میشناسد.
موفقیت در بیلد به معنای امنیت در زمان اجرا (runtime) نیست. سبز بودن تستها به معنای مشاهده یک اپلیکیشن پایدار توسط کاربران نیست. اگر مدل ذهنی شما در مرز TypeScript متوقف شود، دقیقاً در همان جایی که کرشها (crashes) واقعاً رخ میدهند، کورکورانه پرواز خواهید کرد.
سراب زمانِ کامپایل
کل سیستم تایپ TypeScript در طول فرآیند کامپایل پاک میشود. خروجی JavaScript کامپایلشدهی هر پروژهای را باز کنید؛ هیچ اثری از interface ،type یا محدودیتهای جنریک (generic constraints) نخواهید یافت. آنها صرفاً داربستهایی برای زمان طراحی هستند. مرورگر یا فرآیند Node.js جاوااسکریپت خالص را اجرا میکند و تضمینی وجود ندارد که مقادیری که از میان توابع شما عبور میکنند، با تایپهایی که روی کاغذ اعلام کردهاید مطابقت داشته باشند.
این شکاف بیش از هر چیز در لبههای سیستم شما اهمیت دارد. پاسخهای شبکه، ورودیهای کاربر و کتابخانههای شخص ثالث میتوانند مقادیری را تزریق کنند که تایپهای شما را نقض میکنند. متغیری که به عنوان strictEmail: string تعریف کردهاید، اگر دادههای نامعتبر از طریق یک API غیرقابل اعتماد وارد شوند، همچنان میتواند در زمان اجرا حاوی یک عدد باشد. TypeScript نمیتواند برای اعمال قوانین، کد شما را تا مرحله تولید دنبال کند. زمان اجرا (runtime) در سطح کاملاً متفاوتی فعالیت میکند و خلط کردن این دو سطح منجر به شکستهایی میشود که تحلیل استاتیک هرگز قادر به شناسایی آنها نیست.
وقتی اعداد به شما خیانت میکنند
TypeScript یک number میبیند. موتور JavaScript یک ممیز شناور با دقت مضاعف IEEE 754 میبیند. این تفاوت تا زمانی که فاجعهبار نشود، بیضرر است.
JavaScript برای هر عدد ۶۴ بیت اختصاص میدهد، اما تنها ۵۳ بیت آن برای ذخیره مانتیس (mantissa) استفاده میشود. این امر سقف عدد صحیح ایمن را روی ۹,۰۰۷,۱۹۹,۲۵۴,۷۴۰,۹۹۱ قرار میدهد. هر چیزی بزرگتر از این مقدار، به نزدیکترین مقدار قابل نمایش گرد میشود. در عمل، دو شناسه (identifier) واقعاً متفاوت میتوانند در داخل اپلیکیشن شما به یک مقدار واحد تبدیل شوند.
شناسههای Snowflake و سایر شناسههای عدد صحیح ۶۴ بیتی توزیعشده، معمولاً از این محدودیت فراتر میروند. سیستمهای مالی که مبالغ با ارزش بالا را در واحدهای کوچک پول ردیابی میکنند نیز ممکن است با این مشکل مواجه شوند. این خطر اغلب حتی قبل از اجرای منطق تجاری شما ظاهر میشود: `JSON
