TypeScript 6.0 เปลี่ยนแปลงครั้งใหญ่ที่อาจทำให้โค้ดพัง (Breaks by Design)

TypeScript 6.0 มาถึงแล้ว และมันกำลังจะเปลี่ยนทุกอย่าง การเปิดตัวครั้งนี้ถือเป็นการเปลี่ยนแปลงครั้งสำคัญที่สุดนับตั้งแต่เวอร์ชัน 2.x หากคุณยังพึ่งพาการตั้งค่าแบบเก่า (legacy settings) การ Build ครั้งต่อไปของคุณมีโอกาสสูงที่จะล้มเหลว

การเปลี่ยนแปลงหลัก 3 ประการที่จะทำให้โค้ดของคุณพัง:

ทำไมเรื่องนี้ถึงสำคัญ:

Strict Mode แต่ก่อน คุณต้องเลือกเปิดใช้งาน strict mode เอง แต่ตอนนี้มันได้กลายเป็นมาตรฐานไปแล้ว โค้ดประมาณ 70% จะพบข้อผิดพลาด (red builds) ในทันที คุณจะพบกับ error จาก property ที่ไม่ได้กำหนดค่าเริ่มต้น (uninitialized properties), การใช้ implicit any types และค่า null ที่ไม่ได้ตรวจสอบ (unchecked null values)

การยกเลิกการรองรับ ES5 คุณไม่สามารถกำหนด target เป็น ES5 หรือ ES3 ใน tsconfig.json ได้อีกต่อไป ค่าเริ่มต้นใหม่คือ ES2025 หากคุณจำเป็นต้องรองรับเบราว์เซอร์รุ่นเก่า คุณต้องเพิ่มเครื่องมืออื่น เช่น Babel เข้าไปใน pipeline ของคุณ

Module Resolution ค่าเริ่มต้นจะไม่ใช่ CommonJS อีกต่อไป แต่จะเป็น ESNext หากโปรเจกต์ Node.js ของคุณพึ่งพาพฤติกรรมแบบ implicit CommonJS คุณต้องกำหนดค่า module ใน config ของคุณอย่างชัดเจน

วิธีการย้าย (migrate) โดยไม่ทำให้ pipeline พัง:

  1. ตรวจสอบ config ของคุณ อย่าปล่อยให้การตั้งค่าเป็นเรื่องของดวง ให้เพิ่มค่าที่ชัดเจนสำหรับ strict, target และ module ใน tsconfig.json ก่อนที่จะทำการอัปเกรด

  2. ล็อกเวอร์ชันของคุณ ระบุเวอร์ชันของ TypeScript ใน package.json ให้แน่นอน ทดสอบการ build ปัจจุบันด้วยเวอร์ชันเดิมที่คุณมีอยู่ก่อนที่จะขยับไปเป็น 6.0

  3. ใช้ feature branch ติดตั้ง TypeScript 6.0 ใน branch ใหม่ อัปเดต target เป็น ES2025 และกำหนดประเภท module ให้ชัดเจน

  4. ทยอยแก้ไข type ทีละน้อย รัน compiler โดยไม่ต้องสร้างไฟล์ (without emitting files) เพื่อดู error ทั้งหมด ให้ความสำคัญกับ error จาก strictNullChecks และ implicit any ก่อนเป็นอันดับแรก

  5. ทดสอบทุกอย่าง รันชุดการทดสอบ (test suite) ทั้งหมดของคุณ TypeScript ช่วยตรวจจับ type errors แต่การทดสอบของคุณจะช่วยตรวจจับ logic errors ที่เกิดจากความเข้มงวด (strictness) ใหม่นี้

TypeScript 6.0 คือขั้นตอนสุดท้ายก่อนที่จะมีการเขียนใหม่ในเวอร์ชัน 7.0 โดยเวอร์ชัน 7.0 จะใช้ core ที่เขียนด้วยภาษา Go ซึ่งหมายความว่าการรองรับ legacy จะหายไปอย่างสิ้นเชิง

เริ่มปรับปรุง codebase ของคุณให้ทันสมัยตั้งแต่วันนี้ เพื่อหลีกเลี่ยงวิกฤตในอนาคต

ที่มา: https://dev.to/davekurian/typescript-60-launches-strict-mode-by-default-and-drops-es5-support-n31