[TypeScript] lookup ค่าใน object ด้วย key ที่มี type เป็น keyof type
ถ้าเราใช้ JavaScript โดยตรงเราสามารถ access property ใน object ได้โดยใช้ dot .
หรือใช้ indexing operator [property_name]
แบบนี้ แต่พอเป็น TypeScript ตอนเราใช้ indexing operator จะฟ้องว่าเราใส่ผิด type เราต้อง convert string ที่เราใส่ตรง []
เป็น type ของ key ของ object ก่อนด้วย keyof
ตัวอย่างโค้ดง่ายๆเช่น
type Point = { x: number; y: number };
type P = keyof Point;
const p: Point = { x: 10, y: 20 };
const y: string = "y";
console.log(p[y]);
เราจะโดน compiler แจ้ง type error ว่า
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Point'.
No index signature with a parameter of type 'string' was found on type 'Point'.
วิธีแก้คือเราต้องกำหนด type ของ y
ให้เป็น keyof Point
แทนแบบนี้
type Point = { x: number; y: number };
type P = keyof Point;
const p: Point = { x: 10, y: 20 };
const y: keyof Point = "y";
console.log(p[y]);
แต่ถ้าเราไม่ได้เป็นคนสร้าง y
เอง เราก็ต้อง convert type จาก string เป็น keyof Point
เองก่อนแบบนี้
type Point = { x: number; y: number };
type P = keyof Point;
const p: Point = { x: 10, y: 20 };
const y: string = "y";
console.log(p[y as keyof Point]);
ดูเรื่อง keyof เพิ่มเต็มได้ที่นี่ https://www.typescriptlang.org/docs/handbook/2/keyof-types.html