ในโลกของการพัฒนาแอปพลิเคชันสมัยใหม่ การจัดการกับงานที่ไม่พร้อมกัน (Asynchronous Operations) ถือเป็นหัวใจสำคัญ ไม่ว่าจะเป็นการเรียก API จากเซิร์ฟเวอร์, การอ่านไฟล์จากฐานข้อมูล หรือแม้แต่ Timeouts ทั้งหมดเหล่านี้ล้วนต้องพึ่งพากลไกของ Promises ซึ่งช่วยให้โค้ดของเราสามารถไหลได้อย่างมีระเบียบ แม้ว่าจะมีการทำงานที่ล่าช้าก็ตาม อย่างไรก็ปฏิเสธไม่ได้ว่า JavaScript/TypeScript เป็นเครื่องมือที่มีประสิทธิภาพสูง แต่เมื่อเราพูดถึงความทนทานและความน่าเชื่อถือในการรับส่งข้อผิดพลาด (Error Handling) นั้น จำเป็นอย่างยิ่งที่เราจะต้องใช้คุณสมบัติเชิงประเภท (Type System) ที่ TypeScript มอบให้อย่างเต็มรูปแบบ
หลักการพื้นฐาน: ความเปราะบางของการทำ Asynchronicity
Promises ถูกออกแบบมาเพื่อแก้ปัญหา Callback Hell โดยกำหนดสถานะสามประการ คือ Pending (กำลังรอคอย), Resolved (สำเร็จแล้ว) และ Rejected (ล้มเหลวหรือเกิดข้อผิดพลาดขึ้น) ในภาษา JavaScript ทั่วไป เราจะอาศัยเมธอด `.catch()` เพื่อจับภาพ Promise Rejection เสมือนเครือข่ายป้องกัน หากขาดส่วนนี้ ข้อผิดพลาดใด ๆ ก็ตามระหว่างการดำเนินการอาจถูกมองว่าเป็นแค่