اگر امروز از تایپاسکریپت برای پروژههای حجیم استفاده میکنید، زمان انتظار برای بررسی انواع (Type-checking) در محیط ویرایشگر یا خط لوله CI بهطور ملموسی کاهش مییابد. در کدبیس VS Code، زمان ساخت کامل از ۱۲۵.۷ ثانیه به ۱۰.۶ ثانیه رسید که به معنای ۱۱.۹ برابر سرعت بیشتر است.
این جهش خیرهکننده نتیجه انتشار تایپاسکریپت ۷ (TypeScript 7) است. مایکروسافت برای رسیدن به این عدد، تصمیم گرفت کل پروژه را به زبان Go منتقل کند تا از تمام توان سختافزارهای مدرن، بهویژه چندرشتهای بودن (Multithreading) و سرعت اجرای کد نیتیو استفاده کند. تایپاسکریپت از ابتدای ظهور، وعده داد که جاوااسکریپتی در مقیاس بزرگ ارائه دهد و با معرفی بررسی دقیق انواع و ابزارهای غنی، امکان ساخت اپلیکیشنهای باکیفیت در تمامی پلتفرمها را فراهم کرد. اکنون این انتشار، نقطه culmination یا اوج مأموریتی است که هدف آن، سریعتر کردن هر بخش از مجموعه ابزارها به میزان یک مرتبه بزرگی (Order of Magnitude) بود.
سالها بود که توسعهدهندگان با محدودیتهای مقیاسپذیری کامپایلر اصلی تایپاسکریپت دستوپنجه نرم میکردند. در پروژههایی که به میلیونها خط کد میرسند، زمان انتظار برای تایپ-چکینگ در ادیتور یا خط لولههای CI به گلوگاه اصلی در چرخه توسعه تبدیل میشود. تصور کنید دنیایی را که در آن بررسی انواع کل یک پروژه بهجای چندین دقیقه، تنها در چند ثانیه انجام شود؛ این همان تغییر بنیادینی است که این بهروزرسانی به اکوسیستم میآورد. همانطور که در تحلیل قبلی ما درباره امنیت مدلهای بازمتن اشاره کردیم، بهینهسازی زیرساختی همواره پیشنیاز پذیرش ابزارهای پیچیدهتر در مقیاس صنعتی است.
معماری پورت نیتیو
به نقل از وبلاگ مهندسی مایکروسافت (Microsoft)، تیم توسعه یک «پورت وفادار» (Faithful Port) از کدبیس اصلی به زبان Go انجام داده است. آنها ساختار و منطق کامپایلر موجود را حفظ کردند تا تضمین شود که نتایج بین دو نسخه، سازگار و یکسان باقی میماند. سود اصلی از رهایی از یک محیط اجرای مبتنی بر جاوااسکریپت و انتقال به کد نیتیو حاصل شده است.
این زیربنای جدید چندین بهینهسازی فنی حیاتی را معرفی میکند:
- چندرشتهای بودن با حافظه مشترک (Shared Memory Multithreading): کامپایلر اکنون میتواند از چندین هسته CPU بهطور مؤثرتر استفاده کند.
- جریانهای کاری موازی: فرآیندهای تجزیه (Parsing)، بررسی انواع (Type-checking) و تولید کد (Emitting) اکنون بهصورت موازی انجام میشوند.
- یکپارچگی LSP: پروتکل سرور زبان (LSP) جدید اجازه میدهد ویرایشگرها درخواستهای همزمان را بدون مسدود شدن (Blocking) پاسخ دهند.

دستاوردهای عددی در عملکرد
بر اساس بنچمارکهای دنیای واقعی روی پروژههای بزرگ متنباز، تأثیر این تغییرات کاملاً ملموس است. فراتر از VS Code، کدبیس Sentry شاهد کاهش زمان ساخت از ۱۳۹.۸ ثانیه به ۱۵.۷ ثانیه (۸.۹ برابر) بود. پروژههای دیگری مانند Bluesky و Playwright سرعت ۸.۷ برابر و پروژه tldraw بهبود ۷.۷ برابری را تجربه کردند (کاهش از ۱۱.۲ ثانیه به ۱.۴۶ ثانیه).
بهرهوری حافظه نیز بهطور قابلتوجهی بهبود یافته است. کامپایلر TypeScript 7 در طول یک بازه ساخت، به حافظه کلی کمتری نیاز دارد. برای مثال:
- VS Code: اثر حافظه ۱۸ درصد کاهش یافت (از ۵.۲ گیگابایت به ۴.۲ گیگابایت).
- Bluesky: شاهد کاهش ۲۶ درصدی بود (از ۱.۸ گیگابایت به ۱.۳ گیگابایت).
- Playwright: کاهش ۱۱ درصدی را تجربه کرد (از ۱.۰ گیگابایت به ۰.۹ گیگابایت).
- tldraw: کاهش ۱۵ درصدی داشت (از ۰.۶ گیگابایت به ۰.۵ گیگابایت).
- Sentry: کاهش ۶ درصدی را مشاهده کرد (از ۴.۹ گیگابایت به ۴.۶ گیگابایت).

تأثیر بر تجربه توسعهدهنده
بیشترین تغییر در محیط ویرایشگر حس میشود. در کدبیس VS Code، باز کردن فایلی که دارای خطا بود، پیشتر ۱۷.۵ ثانیه طول میکشید تا اولین «خط قرمز» (Squiggle) نمایش داده شود؛ اکنون این زمان به کمتر از ۱.۳ ثانیه رسیده است (۱۳ برابر سریعتر). این تجربه روان در بخشهای «یافتن تمام ارجاعات»، تکمیل خودکار (Auto-completion) و تشخیص خطاها (Diagnostics) نیز تکرار شده است که اکنون تنها بخشی از زمان قبلی را میگیرند. برای توسعهدهندگانی که از حالت --watch استفاده میکنند، چرخه بازخورد (Feedback Loop) اکنون تنگتر و سریعتر از هر زمان دیگری است.
شرکتهایی که در مقیاس بزرگ از این ابزار استفاده میکنند، گزارشهای خیرهکنندهای دادهاند. مهندسان Slack اعلام کردند که این بهروزرسانی ۴۰ درصد از زمان صف ادغام (Merge Queue) آنها را حذف کرد و بررسی انواع در CI را از ۷.۵ دقیقه به ۱.۲۵ دقیقه رساند. پیش از این، توسعه محلی بهدلیل فشار روی سرور تقریباً «غیرقابل استفاده» بود و مهندسان مجبور بودند برای بررسی کامل به CI تکیه کنند؛ اما اکنون همان کدبیس در چند ثانیه بارگذاری میشود.
تیم خدمات خبری مایکروسافت، صرفهجویی ۴۰۰ ساعته در ماه در زمان انتظار CI را گزارش کرد. مهندسان PowerBI تجربه ویرایشگر را «نجاتبخش» توصیف کردند و حتی پیش از آنکه قابلیت تغییر نام (Rename) در VS Code پشتیبانی شود، آن را به عنوان پیشفرض پذیرفتند. توسعهدهندگان Loop که روی مونوریپوی این پروژه کار میکردند و پیشتر تجربه را غیرقابل استفاده میدیدند، اکنون آن را «شگفتآور» مینامند.
توسعهدهندگان Canva نیز گزارش دادند زمان مشاهده اولین خطا در ویرایشگرهایشان از ۵۸ ثانیه به حدود ۴.۸ ثانیه رسیده است. سایر شرکای تست شامل شرکتهای Bloomberg، Figma، Google، Lattice، Linear، Miro، Notion، Vanta و VoidZero بودند.
آمادگی برای تولید و تست
برای تضمین پایداری، تیم توسعه از دهها هزار تست که طی بیش از یک دهه ساخته شده بود، بهره برد. این تستها روی هر کامیت در شاخه اصلی (Main Branch) اجرا میشوند. فراتر از مجموعه تستهای اصلی، تیم طی سال گذشته با تیمهای بزرگ داخلی و خارجی همکاری کرد تا پایداری را روی کدبیسهای واقعی بسنجد.
تستهای داخلی مایکروسافت تیمهای زیر را شامل میشد:
- Loop
- Office
- PowerBI
- Teams
- Xbox
جزئیات زیرساخت تست
تیم توسعه بخش بزرگی از زیرساختهای تست گستردهتر خود را بازسازی کرد تا روی نسخه ۷ اجرا شوند. این تلاش تضمین کرد که پورت نیتیو جدید میتواند پیچیدگیهای کدهای دنیای واقعی را مدیریت کند.
- تست رگرسیون GitHub: تستهای خودکار و بر حسب تقاضا (On-demand) برای پروژههای تایپاسکریپت و جاوااسکریپت در GitHub بازگردانده شد تا پسگراییها (Regressions) در کامپایلر و سرویس زبان شناسایی شوند.
- ردیابی گزارشهای کرش: تیم بازخوردهای صریح کاربران را با گزارشهای خودکار کرش و تستهای تهاجمی ترکیب کرد.
- معیارهای قابلیت اطمینان: تحلیل دادهها نشان میدهد که سرور زبان TypeScript 7.0 دستورات شکستخورده را بیش از ۸۰ درصد و کرشهای سرور را بیش از ۶۰ درصد نسبت به نسخه ۶.۰ کاهش داده است.
تنظیمات موازیسازی
برای مدیریت موازنه بین سرعت و مصرف رم، TypeScript 7.0 پرچمهای (Flags) آزمایشی جدیدی معرفی کرده است:
--checkers: تعداد کارگران (Workers) بررسی انواع را کنترل میکند (پیشفرض ۴). این پرچم تعداد ثابتی از کارگران را ایجاد میکند که هرکدام نمای خاص خود از جهان کد را دارند تا از تکرار بیهوده عملیات جلوگیری شود، در حالی که با حفظ ترتیب یکسان فایلها، نتایجی یکسان تولید میکنند. افزایش این عدد به ۸ در ماشینهای با تعداد هسته زیاد، میتواند سرعت VS Code را تا ۱۶.۷ برابر (۷.۵۱ ثانیه) و Sentry را تا ۱۱.۶ برابر (۱۲.۰۸ ثانیه) ارتقا دهد.--builders: مدیریت سازندههای ارجاع پروژه در حالت--buildاست که برای مونوریپوها حیاتی است. توجه داشته باشید که افزایش همزمان--checkersو--buildersاثر ضربدر دارد (مثلاً ۴ چکر و ۴ بیلدر به معنای امکان فعالسازی تا ۱۶ بررسیکننده است).--singleThreaded: تمام موازیسازیها را برای عیبیابی یا محیطهای کممنابع غیرفعال میکند. این کار تعداد کارگران بررسی انواع را به ۱ محدود کرده و تضمین میکند که تجزیه و تولید کد را بهصورت تکرشتهای انجام دهد.
مکانیزمهای موازیسازی بررسی انواع
بررسی انواع نسبت به تجزیه یا تولید کد، وابستگیهای پیچیدهتری بین فایلها دارد. چون اکثر فایلها به اطلاعات نوع مشترک از اسکوپهای جهانی و وابستگیها نیاز دارند، اجرای کاملاً مستقل کارگران باعث اتلاف شدید محاسبات و حافظه میشد.
- قطعی بودن (Determinism): برای تضمین نتایج سازگار، بررسی انواع از ابتدا (Scratch) باید همیشه فایلها را با ترتیبی دقیقاً یکسان بررسی کند.
- استراتژی کارگر: نسخه ۷.۰ از تعداد ثابتی کارگر استفاده میکند. اگرچه آنها ممکن است برخی کارهای مشترک را تکرار کنند، اما فایلهای ورودی را بهطور یکسان تقسیم میکنند تا ثبات خروجی تضمین شود.
- موازنه منابع: در ماشینهایی با هستههای CPU کمتر (مانند Runnerهای CI)، توسعهدهندگان میتوانند
--checkers 1را تنظیم کنند تا تکرار کارها حذف و سربار (Overhead) کاهش یابد.
حالت جدید --watch
تیم توسعه حالت --watch را بهطور کامل بازسازی کرد. آنها سیستم رصد فایل (File-watcher) باندلر Parcel را از C++ به Go منتقل کردند و از شیمهای (Shims) اسمبلی حداقلی برای حذف وابستگی به زنجیره ابزار (Toolchain) C++ استفاده نمودند.
این اقدام بهدلیل نبود API داخلی برای رصد فایل در کتابخانه استاندارد Go ضروری بود. کتابخانههای شخص ثالث قبلی از مشکلاتی در زمینه پایداری یا عملکرد رنج میبردند. راهکارهای مبتنی بر Polling (پرسوجوی مداوم) برای مقیاسهای بزرگ پروژه، بهویژه در پوشه node_modules بسیار هزینهبر بودند. رصدگر جدید مبتنی بر Go، قابلیتهای پایدار و بهصرفه را در پلتفرمهای مختلف فراهم میکند. تیم توسعه بهطور صریح از Devon Govett برای کارهای انجام شده در Parcel که به این پورت کمک کرد، تشکر کرد.
تغییرات ساختاری و سازگاری
تایپاسکریپت ۷ پیشفرضهای نسخه ۶.۰ را پذیرفته و هشدارهای منسوخشده قبلی را به خطاهای سخت (Hard Errors) تبدیل کرده است. تغییرات مهم در پیکربندی پیشفرض عبارتند از:
strictاکنون بهصورت پیشفرض true است.moduleرویesnextتنظیم شده است.targetروی آخرین نسخه پایدار ECMAScript که بلافاصله پیش ازesnextاست، قرار دارد.noUncheckedSideEffectImportsبهصورت پیشفرض true است.libReplacementبهصورت پیشفرض false است.stableTypeOrderingبهصورت پیشفرض true است و نمیتوان آن را غیرفعال کرد.rootDirاکنون پیشفرض./دارد (دایرکتوریهای منبع داخلی باید صراحتاً تنظیم شوند).typesاکنون پیشفرض[]دارد (که میتواند به["*"]بازگردانده شود).
ویژگیهای منسوخ شده به عنوان خطای سخت
چندین ساختار که در نسخه ۶.۰ منسوخ شده بودند، اکنون به خطاهای سخت با رفتار no-op تبدیل شدهاند:
- هدف/تکرار:
target: es5وdownlevelIterationدیگر پشتیبانی نمیشوند. - تفکیک ماژول:
moduleResolution: classicوnode/node10پشتیبانی نمیشوند. استفاده ازnodenextوbundlerتوصیه میشود. - انواع ماژول:
module: amd, umd, systemjs, noneپشتیبانی نمیشوند؛ ازesnextیاpreserveهمراه با یک باندلر استفاده کنید. - مسیرها:
baseUrlدیگر پشتیبانی نمیشود؛ مسیرها باید نسبت به ریشه پروژه (Project Root) باشند. - سنتکس: کلمه کلیدی
moduleدر اعلانهای namespace ممنوع شد. کلمه کلیدیassertsدر ایمپورتها برای همسویی با ECMAScript باwithجایگزین شد. - سایر موارد:
alwaysStrictاکنون پیشفرض true است؛esModuleInteropوallowSyntheticDefaultImportsرا نمیتوان روی false تنظیم کرد. همچنین/// <reference no-default-lib />تحتskipDefaultLibCheckنادیده گرفته میشود. مسیرهای فایل را نمیتوان از طریق CLI پاس داد اگرtsconfig.jsonوجود داشته باشد، مگر با استفاده از--ignoreConfig.
ابزارهای زبانی پیشرفته
یک تغییر اساسی در نحوه مدیریت یونیکد توسط کامپایلر رخ داده است. انواع Template Literal اکنون نقاط کد (Code Points) یونیکد را بهطور طبیعی حفظ میکنند. برای مثال، ایموجی «😀» بهجای دو جفت جایگزین UTF-16 (\ud83d و \ude00)، به عنوان یک واحد واحد شناخته میشود. اگرچه این تغییر برخی ابزارهای اندازهگیری طول رشته را که بر اساس UTF-16 مدل شده بودند میشکند، اما با رفتار for...of یا عملگر گسترش ([...str]) در جاوااسکریپت کاملاً همراستا است.
بازنگری در پشتیبانی از جاوااسکریپت
پشتیبانی از جاوااسکریپت برای سازگاری بیشتر با فایلهای .ts بازسازی شد. الگوهای زیر دیگر پشتیبانی نمیشوند:
- مقادیر در برابر انواع: مقادیر (Values) نمیتوانند در جایی که نوع (Type) انتظار میرود استفاده شوند (در این موارد از
typeof someValueاستفاده کنید). - Enumها: تگ
@enumحذف شد؛ بهجای آن از@typedefروی(typeof YourEnumDeclaration)[keyof typeof YourEnumDeclaration]استفاده کنید. - انواع: علامت
?مستقل دیگر قابل استفاده نیست؛ بهجای آن ازanyاستفاده کنید. نامهای نوع باید در تگ@typedefباشند، نه فقط در مجاورت یک شناسه. - کلاسها: تگ
@classدیگر یک تابع را به سازنده تبدیل نمیکند؛ باید از اعلانهای کلاس (Class Declarations) استفاده شود. - سنتکس: علامت
!پسوند (Postfix) پشتیبانی نمیشود (ازTاستفاده کنید). سینتکس تابعی مدل Closure (مانندfunction(string): void) پشتیبانی نمیشود؛ از(s: string) => voidاستفاده کنید. - سایر موارد: نامهای مستعار (Aliasing) برای
thisو تخصیص مجدد کل پروتوتایپ یک تابع دیگر بهطور خاص پردازش نمیشوند.
تجربه ویرایشگر و LSP
تایپاسکریپت ۷ از پروتکل سرور زبان (LSP) برای پاسخ به درخواستهای همزمان در چندین رشته استفاده میکند. اگرچه نسخه بتا شکافهایی داشت، اما انتشار نهایی شامل ویژگیهای حیاتی است:
- ابزارهای اصلی: وارد کردن خودکار (Auto-imports)، نمایشهای بازشونده (Expandable hovers) و راهنمایهای داخلی (Inlay hints).
- ناوبری پیشرفته: Code lenses، رفتن به تعریف منبع (Go-to-source-definition) و ویرایش لینکشده در JSX.
- بازسازی (Refactoring): تکمیل تگها، هایلایت معنایی، مرتبسازی ایمپورتها و حذف ایمپورتهای بدون استفاده.
استراتژی انتقال
از آنجا که نسخه ۷ هنوز API برنامهنویسی (Programmatic API) پایداری را عرضه نکرده است، نمیتواند فعلاً در ابزارهایی که کامپایلرهای خاص خود را دارند جاسازی شود. این یعنی گردشهای کاری در Vue، MDX، Astro، Svelte و قالبهای Angular احتمالاً فعلاً از نسخه ۶.۰ استفاده خواهند کرد.
پروژههای Angular میتوانند از رویکرد ترکیبی استفاده کنند: نسخه ۷ برای تشخیص خطای CLI از طریق tsc و نسخه ۶.۰ برای پشتیبانی در ویرایشگر. در VS Code، کاربران میتوانند با اجرای دستور «Disable TypeScript 7 Language Server» به نسخه ۶ بازگردند.
برای تسهیل انتقال، مایکروسافت بسته سازگاری @typescript/typescript6 را منتشر کرد. این به توسعهدهندگان اجازه میدهد tsc6 (نسخه ۶) و tsc (نسخه ۷) را بهصورت همزمان با استفاده از نامهای مستعار (Aliases) در npm اجرا کنند. برای ابزارهایی مانند typescript-eslint که به وابستگیهای peer نسخه ۶ نیاز دارند، پیکربندی زیر در package.json توصیه میشود:
{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.2",
"typescript-7": "npm:typescript@^7.0.2"
}
}
تحلیل: تغییر به سمت ابزارهای نیتیو
این حرکت نشاندهنده یک روند گستردهتر است: دوران «جاوااسکریپت برای همه چیز» در حال رسیدن به سقف توان خود است. در حالی که جاوااسکریپت زبان وب است، ابزارهایی که آن را میسازند بهطور فزایندهای به زبانهای نیتیو (Go, Rust) منتقل میشوند تا از سربار ذاتی موتور V8 اجتناب کنند.
برای توسعهدهنده فردی، این بدان معناست که چرخه بازخورد دیگر یک منبع اصطکاک نیست. وقتی تایپ-چکینگ «لحظهای» شود، توسعهدهندگان بیشتر تمایل پیدا میکنند تا به جای استفاده از any برای دور زدن کامپایلر کند، به تایپهای سخت (Strict Typing) تکیه کنند. این امر احتمالاً منجر به ارتقای کیفیت کلی کد در سراسر اکوسیستم میشود، زیرا «مالیات» یا هزینه زمانی تایپگذاری دقیق حذف شده است.
گام بعدی شما
توسعهدهندگان میتوانند نسخه جدید را از طریق npm install -D typescript نصب کنند. برای کسانی که از بسته @typescript/native-preview (که ۸.۵ میلیون دانلود هفتگی داشت) استفاده میکردند، بیلدهای شبانه اکنون تحت بسته استاندارد typescript با تگ next بازمیگردند: npm install -D typescript@next.
مستندات ویرایشگر خود را برای افزونه اختصاصی تایپاسکریپت ۷ بررسی کنید. در VS Code، کاربران میتوانند تجربه جدید را از طریق دستورات Enable/Disable سرور زبان تست کنند. کاربران Visual Studio این قابلیت را بهصورت خودکار بر اساس فضای کاری (Workspace) خود فعال خواهند دید. همچنین منتظر انتشار نسخه TypeScript 7.1 باشید که انتظار میرود API پایدار جدید را برای یکپارچگی ابزارهای اکوسیستم معرفی کند. تیم توسعه قصد دارد به چرخه انتشار استاندارد (نسخههای دارای ویژگی هر ۳ تا ۴ ماه یکبار) بازگردد.
اما این جهش سرعت تنها بخشی از یک تغییر بزرگتر در ابزارهای توسعه است؛ برای درک اینکه چرا Rust و Go در حال بلعیدن سهم بازار ابزارهای JS هستند، به تحلیل ما درباره تولکیتهای نیتیو مراجعه کنید.




گفتگو