TypeScript 7 با معرفی کامپایلر جدید خود که بر پایه Go است، یعنی tsgo، در حال از کار انداختن ابزارهای توسعه محبوب مانند ESLint، ts-jest و ts-morph است. این مشکل تا زمانی که API برنامه‌نویسی این کامپایلر در نسخه آتی 7.1 پایدار شود، ادامه خواهد داشت؛ بنابراین تیم‌هایی که به این ابزارها متکی هستند، باید هرگونه برنامه‌ریزی برای ارتقا را متوقف کنند.

چه چیزی در TypeScript 7 تغییر کرده است

این نسخه tsgo را معرفی کرده است؛ نسخه‌ای از type-checker که به زبان Go بازنویسی شده و تیم TypeScript نام مستعار آن را Project Corsa گذاشته است. با انتقال هسته اصلی از JavaScript به Go، این کامپایلر می‌تواند سرعت ساخت (build) را تا ده برابر افزایش دهد؛ خبری که باعث جذب کاربران اولیه شده است که به دنبال کاهش زمان در خط لوله (pipeline) CI خود هستند.

چرا ابزارها با مشکل مواجه می‌شوند

ابزارهایی که با TypeScript کار می‌کنند، مستقیماً با type-checker ارتباط برقرار نمی‌کنند. آن‌ها مجموعه‌ای از APIهای داخلی را فراخوانی می‌کنند که اطلاعات تایپ (type information)، تشخیص‌ها (diagnostics) و پیمایش AST را ارائه می‌دهند. این APIها برای tsgo بازنویسی شده‌اند و تا نسخه 7.1 در حال تغییر هستند. نتیجه این امر، مجموعه‌ای از کرش‌ها و خطاهای بی‌صدا است:

  • typescript-eslint – npm از نصب آن در کنار TypeScript 7 خودداری می‌کند؛ و در صورت نصب اجباری، ESLint خطای TypeError می‌دهد.
  • ts-jest – سعی می‌کند متدهای داخلی را فراخوانی کند که دیگر در نسخه Go وجود ندارند، که باعث توقف تبدیل (transformation) فایل‌های تست می‌شود.
  • ts-morph – انتظار دارد API پایدار برای پیمایش ساختار کد وجود داشته باشد؛ با API فعلی، ممکن است نتایج اشتباه برگرداند یا بدون هشدار با خطا مواجه شود.
  • Monorepos – tsgo برخی از پارامترهای نوع عمومی (generic type parameters) را حذف می‌کند که منجر به خطاهای تایپ می‌شود که فقط در پروژه‌های بزرگ و چند-بسته‌ای (multi-package) ظاهر می‌شوند.

هر گردش کاری (workflow) که شامل linting، تست با Jest یا تحلیل کد با TypeScript 7 باشد، احتمالاً با شکست در build (red builds) مواجه خواهد شد.

چه کسانی تحت تأثیر قرار می‌گیرند

  • تیم‌های Front-end که ESLint را به عنوان بخشی از هر pull request اجرا می‌کنند.
  • سرویس‌های Back-end که برای تست واحد (unit testing) به ts-jest متکی هستند.
  • کتابخانه‌هایی که از ts-morph برای تولید کد (code generation) یا مستندسازی استفاده می‌کنند.
  • سازمان‌هایی با ساختار monorepo که استنتاج تایپ (type inference) در آن‌ها از قبل پیچیده است.

اگر خط لوله CI شما پس از ارتقای TypeScript با خطا (red) مواجه شد، مقصر احتمالاً یکی از موارد بالا است.

یک مسیر مهاجرت امن تا نسخه 7.1

ساده‌ترین راه برای بهره‌مندی از سرعت بیشتر بدون از کار انداختن ابزارها، جدا کردن مرحله سریع type-checking از فرآیند اصلی build است:

  1. نسخه اصلی TypeScript را روی 6.x ثابت نگه دارید – این کار باعث حفظ API پایداری می‌شود که همه ابزارها انتظار آن را دارند.
  2. بسته @typescript/native-preview را به عنوان یک dev dependency اضافه کنید – این بسته شامل باینری tsgo برای type-checking سریع در CI است.
  3. tsgo را با فلگ --noEmit برای بررسی‌های سریع اجرا کنید – این دستور تایپ‌ها را اعتبارسنجی می‌کند اما فایل خروجی تولید نمی‌کند.
  4. از کامپایلر کلاسیک tsc برای buildهای اصلی استفاده کنیدtsc همچنان فایل‌های JavaScript تولید می‌کند و از API نسخه 6.x پیروی می‌کند.
npm install -D typescript@^6.9
npm install -D @typescript/native-preview

اسکریپت‌های package.json خود را به‌روزرسانی کنید:

{
  "scripts": {
    "typecheck:fast": "tsgo --noEmit",
    "build": "tsc"
  }
}

با این تنظیمات دوگانه، شما سرعت ده برابری در CI را حفظ می‌کنید و در عین حال سازگاری با ESLint، ts-jest و ts-morph را نیز حفظ خواهید کرد.

چه زمانی می‌توانید مستقیماً به 7.0 ارتقا دهید

اگر کد شما فقط از tsc استفاده می‌کند — بدون linting، بدون Jest و بدون ts-morph — آنگاه API ناپایدار تأثیری روی شما نخواهد داشت. در این سناریوی محدود، می‌توانید بلافاصله به TypeScript 7 مهاجرت کنید و از بهبود عملکرد بدون مراحل اضافی لذت ببرید.

مواردی که باید مراقب آن‌ها باشید

  • نسخه 7.1 – تیم TypeScript اعلام کرده است که API برنامه‌نویسی در این نسخه تثبیت خواهد شد. پس از انتشار آن، پل ارتباطی بین tsgo و ابزارهای موجود از بین خواهد رفت و امکان ارتقای بدون مشکل فراهم می‌شود.
  • به‌روزرسانی ابزارها – انتشار نسخه‌های جدید typescript-eslint ،ts-jest و ts-morph را دنبال کنید. آن‌ها مدت کوتاهی پس از انتشار نسخه 7.1، نسخه‌های سازگار را منتشر خواهند کرد.
  • پیکربندی CI – به یاد داشته باشید که پس از پایدار شدن API، عبارت tsgo --noEmit را با یک فراخوانی معمولی tsc جایگزین کنید؛ دیگر نیازی به بسته preview نخواهد بود.

نکته کلیدی: تا زمانی که API در نسخه 7.1 قفل (lock-in) شود، برای کامپایلر اصلی خود از TypeScript 6.x استفاده کنید، برای بررسی‌های سریع @typescript/native-preview را اضافه کنید و همچنان از tsc برای buildها استفاده کنید. این کار از خرابی linting و تست جلوگیری می‌کند و در عین حال از مزایای عملکردی موتور جدید Go بهره‌مند می‌شوید.