ข้ามไปเนื้อหาหลัก

unknown vs any — ต่างกันตรงที่ต้อง narrow ก่อนใช้

any ปิด type checker ทั้งหมด ส่วน unknown บังคับ narrow ก่อน — ใช้ unknown เมื่อไม่รู้ type จริงๆ

any บอก TypeScript ว่า “ไม่ต้อง check อะไรทั้งนั้น”:

const x: any = 'hello';
x.toFixed(2);  // ✅ TypeScript ยอม แต่ runtime error

unknown บังคับ narrow ก่อนใช้:

const y: unknown = 'hello';
y.toUpperCase();  // ❌ Error: Object is of type 'unknown'

if (typeof y === 'string') {
  y.toUpperCase();  // ✅ ผ่าน เพราะ narrow แล้ว
}

กฎง่ายๆ:

  • ได้ค่าจาก API/external source ที่ไม่แน่ใจ type → ใช้ unknown + narrow หรือ Zod parse
  • ต้องปิด type check จริงๆ มีเหตุผล → ใช้ any + comment อธิบาย
  • ไม่มีเหตุผลเลย → ไม่ใช้ทั้งคู่

unknown ทำให้ code safe กว่าเพราะบังคับให้คิดถึง type ก่อนใช้งาน ไม่ใช่แค่เดา