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 ก่อนใช้งาน ไม่ใช่แค่เดา