Back to notes
mastery-frontend-typescript
Featured

Modern TypeScript Mastery: ปรัชญาการออกแบบโค้ดระดับ Senior

เจาะลึกปรัชญา TypeScript ตั้งแต่ Structural Typing ไปจนถึงวิธีก้าวข้ามพ้นจาก any และตารางเปรียบเทียบความปลอดภัยของโค้ด

January 30, 20262 min read readNNexis by Seereen

🛑 1. The Problem First: ความสยองของ "undefined is not a function"

ลองดูโค้ดที่ดูเหมือนจะใช้งานได้ใน JavaScript:

HLJS JAVASCRIPT
// ❌ Naive Approach: สุ่มเสี่ยงต่อการระเบิดตอนรัน
function processUser(user) {
  console.log(user.profile.name); // ถ้าลืมส่ง profile มา หรือสะกดผิดล่ะ? 🌋
}
processUser({ name: "Joe" }); // Uncaught TypeError: Cannot read property 'name' of undefined

ปัญหา: บั๊กพวกนี้ชอบไปโผล่ตอน Production (ตอนถึงมือลูกค้าแล้ว) การแก้บั๊กในหน้างานจริงมันแพงกว่าการแก้ตอนกำลังเขียนหลายเท่า!


💡 2. Real-Life Analogy: พิมพ์เขียว vs ตัวอาคารจริง

ลองนึกภาพว่าคุณกำลัง "สร้างบ้านแบบไม่มีพิมพ์เขียว".

  • JavaScript: คุณเดินไปหน้างานแล้วบอกช่างว่า "เอาหน้าต่างตรงนี้ละกัน" พอสร้างเสร็จ อ้าว! หน้าต่างดันไปอยู่กลางเสาบ้าน (Runtime Error)
  • TypeScript: คือการที่คุณต้องเขียน "พิมพ์เขียวเชิงเทคนิค" อย่างละเอียดก่อนลงมือเซาะปูน ถ้าในแบบระบุว่าหน้าต่างต้องกว้าง 1 เมตร แต่คุณพยายามเอาหน้าต่าง 2 เมตรมาใส่ สถาปนิก (TS Compiler) จะเดินมาตีมือคุณทันทีตั้งแต่อยู่ในกระดาษ!

🚀 3. Execution Journey: จาก Type สู่ Runtime

TypeScript ทำงานผ่านกระบวนการที่เรียกว่า "Transpilation".

🛠 Step-by-step:

  1. Develop: ขณะคุณพิมพ์ TS จะเช็คเงื่อนไขที่คุณตั้งไว้ (Type Checking)
  2. Compile: เมื่อคุณสั่งรัน tsc, Compiler จะทำหน่าที่ "ลบ Type ทั้งหมดทิ้ง" (Type Erasure)
  3. Runtime: สิ่งที่เหลืออยู่คือ JavaScript เพียวๆ ซึ่ง Browser อ่านออก
HLJS TYPESCRIPT
// ✅ Best Practice: ใช้ Interface เพื่อนิยามสัญญา (Contract)
interface User {
  id: string;
  profile?: { name: string }; // ? คือการบอกว่า "อาจจะไม่มีก็ได้นะ"
}

function printName(u: User) {
  // 🛠 ชัวร์ 100% เพราะ TS บังคับให้จัดการเคส undefined
  console.log(u.profile?.name ?? 'Anonymous");
}

🪤 4. The Junior Trap: โรคติดต่อของ any

จูเนียร์ที่ขี้เกียจมักจะทำแบบนี้:

HLJS TYPESCRIPT
// ❌ Junior Trap: ใช้ any เพื่อให้ Error หายไป
function logData(data: any) {
  console.log(data.whatever.you.want);
}

ระวัง: การใช้ any คือการบอก TypeScript ว่า "เลิกทำงานซะ ฉันจะดูแลตัวเอง" ซึ่งสุดท้ายคุณก็จะกลับไปเจอฝันร้ายเดิมเหมือนตอนเขียน JavaScript ✅ การแก้ไข: ใช้ unknown แล้วทำ Type Guard หรือใช้ interface ที่ชัดเจนเสมอ


⚖️ 5. The Why Matrix: ทำไมต้องเปลี่ยน?

หัวข้อJavaScript (Dynamic)TypeScript (Static)
การตรวจจับบั๊กเจอตอนรัน (Runtime)เจอตอนเขียน (Compile time)
Refactoringยากและน่ากลัว (ต้องไล่แก้เอง)ง่ายและมั่นใจ (Rename ปุ๊บ แก้ทั้งโปรเจกต์)
Documentต้องเขียน README แยกType คือสารคดีที่มีชีวิตในโค้ด

🎓 6. Senior Mindset Summary

การเป็น Senior ไม่ใช่คนที่มีความจำดีเลิศเรื่อง Syntax แต่คือคนที่ "ไม่เชื่อใจตัวเอง" จึงใช้ระบบ Type มาช่วยเป็นเกราะป้องกันไม่ให้ตัวเอง (และทีม) ทำพลาดครับ!

Share this note

© 2026 My Notes by Seereen