TypeScript 7-এর নতুন Go-ভিত্তিক কম্পাইলার, tsgo, ইতিমধ্যেই ESLint, ts-jest এবং ts-morph-এর মতো জনপ্রিয় ডেভেলপমেন্ট টুলগুলোকে অচল করে দিচ্ছে। কম্পাইলারের প্রোগ্রাম্যাটিক API আসন্ন 7.1 রিলিজের মাধ্যমে স্থিতিশীল না হওয়া পর্যন্ত এই সমস্যা চলতে থাকবে, যার অর্থ হলো যে দলগুলো এই টুলগুলোর ওপর নির্ভরশীল তাদের আপগ্রেড পরিকল্পনা স্থগিত রাখা উচিত।

TypeScript 7-এ কী পরিবর্তন হয়েছে

এই রিলিজটি tsgo নিয়ে এসেছে, যা টাইপ-চেকারের একটি Go পোর্ট এবং TypeScript টিম এর কোডনেম দিয়েছে Project Corsa। কোর (core) অংশটি JavaScript থেকে Go-তে সরিয়ে নেওয়ার ফলে কম্পাইলারটি দশ গুণ পর্যন্ত দ্রুত বিল্ড দিতে সক্ষম, যা CI পাইপলাইনে সময় বাঁচাতে আগ্রহী ব্যবহারকারীদের আকর্ষণ করেছে।

কেন টুলগুলো কাজ করছে না

TypeScript-এর সাথে কাজ করা টুলগুলো সরাসরি টাইপ-চেকারের সাথে যোগাযোগ করে না। তারা একগুচ্ছ ইন্টারনাল API ব্যবহার করে যা টাইপ ইনফরমেশন, ডায়াগনস্টিকস এবং AST ট্রাভার্সাল প্রকাশ করে। সেই API গুলো tsgo-এর জন্য পুনরায় লেখা হয়েছে এবং ভার্সন 7.1 না আসা পর্যন্ত এগুলো পরিবর্তনশীল থাকবে। এর ফলে ক্র্যাশ এবং সাইলেন্ট ফেইলিওর (silent failures) এর একটি ধারা তৈরি হচ্ছে:

  • typescript-eslint – TypeScript 7-এর সাথে এটি ইনস্টল করতে npm বাধা দিচ্ছে; জোরপূর্বক ইনস্টল করলে ESLint একটি TypeError দেখায়।
  • ts-jest – এটি এমন কিছু ইন্টারনাল মেথড কল করার চেষ্টা করে যা Go ভার্সনে আর নেই, যার ফলে টেস্ট-ফাইল ট্রান্সফরমেশন বন্ধ হয়ে যায়।
  • ts-morph – এটি কোড স্ট্রাকচার ট্রাভার্স করার জন্য একটি স্থিতিশীল API আশা করে; বর্তমান API-এর কারণে এটি ভুল ফলাফল দিতে পারে বা কোনো সতর্কতা ছাড়াই ব্যর্থ হতে পারে।
  • Monorepos – tsgo কিছু নির্দিষ্ট generic type parameters বাদ দিয়ে দেয়, যার ফলে বড় এবং মাল্টি-প্যাকেজ প্রজেক্টগুলোতে টাইপ এরর দেখা দেয়।

যে কোনো ওয়ার্কফ্লো যেখানে লিন্টিং (linting), Jest টেস্টিং বা কোড-অ্যানালাইসিসের সাথে TypeScript 7 ব্যবহার করা হচ্ছে, সেখানে সম্ভবত 'red builds' (বিল্ড ফেইল) দেখা যাবে।

কারা প্রভাবিত হচ্ছে

  • ফ্রন্ট-এন্ড টিম যারা প্রতিটি pull request-এর অংশ হিসেবে ESLint চালায়।
  • ব্যাক-এন্ড সার্ভিস যারা ইউনিট টেস্টিংয়ের জন্য ts-jest-এর ওপর নির্ভর করে।
  • লাইব্রেরি যারা কোড জেনারেশন বা ডকুমেন্টেশনের জন্য ts-morph ব্যবহার করে।
  • সেই সব সংস্থা যাদের monorepo সেটআপ রয়েছে এবং যেখানে টাইপ ইনফারেন্স (type inference) ইতিমধ্যেই জটিল।

TypeScript আপগ্রেড করার পর যদি আপনার CI পাইপলাইন লাল হয়ে যায় (ফেইল করে), তবে এর কারণ সম্ভবত উপরের যেকোনো একটি।

7.1 ভার্সন না আসা পর্যন্ত একটি নিরাপদ মাইগ্রেশন পথ

টুলগুলোকে অচল না করে স্পিড বা গতির সুবিধা বজায় রাখার সহজ উপায় হলো আসল বিল্ড থেকে দ্রুত টাইপ-চেকিং ধাপটিকে আলাদা করা:

  1. মূল TypeScript ভার্সনটি 6.x-এ পিন (pin) করে রাখুন – এটি সেই স্থিতিশীল API বজায় রাখবে যা সব টুল আশা করে।
  2. ডেভ ডিপেন্ডেন্সি (dev dependency) হিসেবে @typescript/native-preview যোগ করুন – এই প্যাকেজটি CI-তে দ্রুত টাইপ-চেকিংয়ের জন্য tsgo বাইনারি প্রদান করে।
  3. দ্রুত চেকের জন্য --noEmit সহ tsgo চালান – এটি টাইপ ভ্যালিডেট করে কিন্তু কোনো আউটপুট ফাইল তৈরি করে না।
  4. আসল বিল্ডের জন্য ক্লাসিক tsc কম্পাইলার ব্যবহার করুনtsc এখনও JavaScript তৈরি করে এবং 6.x API মেনে চলে।
npm install -D typescript@^6.9
npm install -D @typescript/native-preview

আপনার package.json স্ক্রিপ্ট আপডেট করুন:

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

এই ডুয়াল সেটআপের মাধ্যমে আপনি ESLint, ts-jest এবং ts-morph-এর সাথে সামঞ্জস্য বজায় রেখে CI-তে দশ গুণ গতির সুবিধা পাবেন।

কখন আপনি সরাসরি 7.0-এ আপগ্রেড করতে পারেন

যদি আপনার কোডবেস শুধুমাত্র tsc কল করে—কোনো লিন্টিং, কোনো Jest বা কোনো ts-morph না থাকে—তবে এই অস্থির (unstable) API আপনাকে প্রভাবিত করবে না। সেই বিশেষ ক্ষেত্রে আপনি অবিলম্বে TypeScript 7-এ চলে যেতে পারেন এবং অতিরিক্ত পদক্ষেপ ছাড়াই পারফরম্যান্সের উন্নতি উপভোগ করতে পারেন।

যা খেয়াল রাখতে হবে

  • ভার্সন 7.1 – TypeScript টিম ইঙ্গিত দিয়েছে যে এই রিলিজের মাধ্যমে প্রোগ্রাম্যাটিক API ফ্রিজ (freeze) বা স্থিতিশীল করা হবে। এটি চলে আসলে tsgo এবং বিদ্যমান টুলের মধ্যে সংযোগটি স্থায়ী হবে, যা একটি ক্লিন আপগ্রেড নিশ্চিত করবে।
  • টুলিং আপডেটtypescript-eslint, ts-jest এবং ts-morph-এর নতুন রিলিজের দিকে নজর রাখুন। 7.1 রিলিজ হওয়ার কিছুকাল পরেই তারা সামঞ্জস্যপূর্ণ ভার্সন প্রকাশ করবে।
  • CI কনফিগারেশন – API স্থিতিশীল হয়ে গেলে tsgo --noEmit-এর পরিবর্তে সাধারণ tsc কল ব্যবহার করতে ভুলবেন না; তখন প্রিভিউ প্যাকেজটির আর প্রয়োজন হবে না।

সারকথা: 7.1 API লক-ইন না হওয়া পর্যন্ত, আপনার মূল কম্পাইলার হিসেবে TypeScript 6.x ব্যবহার করুন, দ্রুত চেকের জন্য @typescript/native-preview যোগ করুন, এবং বিল্ডের জন্য tsc ব্যবহার চালিয়ে যান। এটি লিন্টিং এবং টেস্টিং ভেঙে যাওয়া এড়াবে এবং একই সাথে নতুন Go ইঞ্জিনের পারফরম্যান্সের সুবিধা প্রদান করবে।