הקומפיילר החדש של TypeScript 7 מבוסס ה-Go, בשם tsgo, כבר גורם לתקלות בכלי פיתוח פופולריים כמו ESLint, ts-jest ו-ts-morph. התקלות יימשכו עד שה-API התכנותי של הקומפיילר יתייצב בגרסה 7.1 הקרובה, מה שאומר שצוותים הנשענים על הכלים הללו צריכים להשהות כל תוכנית שדרוג.

מה השתנה ב-TypeScript 7

הגרסה הציגה את tsgo, פורט של בודק הטיפוסים (type-checker) לשפת Go, שקיבל את שם הקוד Project Corsa מצד צוות TypeScript. על ידי העברת הליבה מ-JavaScript ל-Go, הקומפיילר יכול לספק בנייה (builds) מהירה פי עשרה, כותרת שמשכה מאמצים מוקדמים המבקשים לקצר דקות מתהליכי ה-CI.

מדוע הכלים נכשלים

כלים שעובדים עם TypeScript אינם מתקשרים ישירות עם בודק הטיפוסים. הם קוראים למערכת של APIs פנימיים החושפים מידע על טיפוסים, אבחונים (diagnostics) וסריקת AST. ה-APIs הללו נכתבו מחדש עבור tsgo ונותרו בתהליך שינוי עד לגרסה 7.1. התוצאה היא שרשרת של קריסות וכשלים שקטים:

  • typescript-eslint – npm מסרב להתקין אותו לצד TypeScript 7; התקנה בכוח גורמת ל-ESLint להקפיץ TypeError.
  • ts-jest – מנסה לקרוא למתודות פנימיות שכבר לא קיימות בגרסת ה-Go, מה שגורם לביטול תהליך ה-transformation של קבצי הבדיקה.
  • ts-morph – מצפה ל-API יציב כדי לסרוק את מבנה הקוד; עם ה-API הנוכחי, הוא עלול להחזיר תוצאות שגויות או להיכשל ללא אזהרה.
  • Monorepos – tsgo מסיר פרמטרים מסוימים של generic types, מה שמוביל לשגיאות טיפוס שמופיעות רק בפרויקטים גדולים ורב-חבילתיים (multi-package).

כל תהליך עבודה המשלב linting, בדיקות Jest או ניתוח קוד עם TypeScript 7 צפוי לחוות "builds אדומים" (כשלונות בבנייה).

מי מושפע

  • צוותי Front-end שמריצים ESLint כחלק מכל pull request.
  • שירותי Back-end הנשענים על ts-jest לבדיקות יחידה (unit testing).
  • ספריות המשתמשות ב-ts-morph ליצירת קוד או תיעוד.
  • ארגונים עם הגדרות monorepo שבהן הסקת טיפוסים (type inference) היא כבר מורכבת.

אם תהליך ה-CI שלכם הפך לאדום לאחר שדרוג TypeScript, האשם הוא כנראה אחד מאלה.

מסלול הגירה בטוח עד לגרסה 7.1

הדרך הפשוטה ביותר לשמור על שיפור המהירות מבלי לשבור את הכלים היא להפריד בין שלב בדיקת הטיפוסים המהיר לבין הבנייה (build) בפועל:

  1. קבעו (Pin) את גרסת ה-TypeScript הראשית ל-6.x – זה שומר על ה-API היציב שכל הכלים מצפים לו.
  2. הוסיפו את @typescript/native-preview כתלות פיתוח (dev dependency) – החבילה מספקת את הבינארי של tsgo לבדיקת טיפוסים מהירה ב-CI.
  3. הריצו את tsgo עם --noEmit לבדיקות מהירות – זה מאמת את הטיפוסים אך אינו מייצר קבצי פלט.
  4. השתמשו בקומפיילר ה-tsc הקלאסי לבנייה בפועלtsc עדיין מייצר JavaScript ומ