Freerange: باگهای عددی تایپاسکریپت رو قبل از اجرا بگیر
خلاصهٔ کاملتر
تو صفحهٔ معرفی Freerange اومده که این ابزار روی API رسمی خود TypeScript سواره — نه زبون جدیده، نه فورک، و هیچ انوتیشن یا فانکشن کتابخونهای هم لازم نداره. کارش اینه که برای هر number کمینه و بیشینهٔ ممکن، صحیح بودن یا نبودنش، و احتمال NaN یا بینهایت شدنش رو نگه میداره و همین اطلاعات رو لای فانکشنها دنبال میکنه. چون همهچیز موقع بیلد حساب میشه، لازم نیست برنامه رو بالا بیاری.
مثالی که خود مخزن میزنه یه باگ چیدمانه:
function gridColumnCount(containerWidth: number) {
return Math.floor(containerWidth / 240)
}
function gridItemWidth(containerWidth: number) {
return containerWidth / gridColumnCount(containerWidth)
}به توضیح نویسنده، Freerange عدد ورودی 200 رو تا داخل gridItemWidth و بعد gridColumnCount دنبال میکنه، در میآره که Math.floor(200 / 240) میشه صفر، و بعد تقسیم روی همون صفر رو خطا میده. تایپاسکریپت فقط میدونه اینا عددن؛ Freerange محدودهشون رو دنبال میکنه.
بخش جالب دیگه خوندن ایستای console.assertه. اگه این کالها اول فانکشن بیان، شرط لازم برای صداکننده حساب میشن و هر کالر باید رعایتشون کنه؛ اگه بعدتر بیان، خود Freerange سعی میکنه ثابتشون کنه. مثلاً با یه console.assert) صدا زدن فانکشن با مقدار ۲٫۲ موقع کامپایل خطا میده نه موقع اجرا. فعلاً فقط تو فانکشنهای نامدار سطح بالا و برای چکهای سادهٔ عددی کار میکنه.
نویسنده تأکید میکنه که ابزار عمداً فقط یه زیرمجموعه از تایپاسکریپت رو تحلیل میکنه: فانکشنهای همفایل، عدد و بولین و آبجکت ساده و آرایهٔ dense، شرط و حلقههای معمولی. ایمپورتها، اسپرد آبجکت، نوشتن روی پراپرتی و getterهای پویا بیرون از این محدودهان. دستور fr --audit هم قرارداد هر فانکشن (requires، ensures، assumes) و پیشنهاد ریفکتور رو چاپ میکنه، و پیشنهاد صریح نویسنده اینه که همین ریفکتورها رو به ایجنتهای هوش مصنوعی بسپری.
نکات کلیدی:
- محدودهٔ عددی هر number رو موقع بیلد دنبال میکنه تا NaN، بینهایت، تقسیم بر صفر و ایندکس نامعتبر پیدا بشه
- روی API رسمی تایپاسکریپت سواره و tsconfig خودت رو رعایت میکنه، پس میتونه جای tsc --noEmit بشینه
- console.assert اول فانکشن یعنی شرط برای کالر، و جاهای دیگه یعنی چیزی که باید ثابت بشه
- فقط یه زیرمجموعهٔ محدود از TypeScript پشتیبانی میشه و fr --audit میگه کجا باید ریفکتور کنی




