typescript - ประเภท Record ไม่เข้ากับประเภทวัตถุเฉพาะ
ทำไมโค้ดชิ้นนี้ถึงไม่ทำงาน? beta จริง ๆ มีคีย์ที่เป็นชนิด string และค่าของมันก็เข้ากันได้ (id จริง ๆ แล้วเป็นชนิด number และ temp จริง ๆ แล้วเป็นชนิด number) และที่สำคัญที่สุด Record ทำให้ค่าของทุกคีย์เป็น any และ any ควรเข้ากันได้กับทุกอย่าง
const alpha: Record<string, any> = {
id: 1,
temp: 2
};
const beta : {
id: number;
temp: number
} = alpha;
แล้วทำไมมันถึงพูดแบบนั้นล่ะ?
ประเภท 'Record
' ขาดคุณสมบัติดังต่อไปนี้จากประเภท '{ id: number; temp: number; }': id, temp
คำตอบ #1
beta คาดหวังคุณสมบัติ id และ temp
เพราะคุณได้ระบุประเภทที่ชัดเจนสำหรับ alpha TS จึงถือว่า alpha เป็น Record<string, any> และไม่ใช่ {id: number; temp: number}
ดังนั้น จึงไม่มีการรับประกันว่า Record<string, any> จะมี id และ temp
คุณต้องลบชนิดข้อมูลที่ระบุไว้ชัดเจนออกจาก alpha.
พยายามหลีกเลี่ยงการระบุประเภทอย่างชัดเจนในกรณีเช่นนี้ เพราะ TS ส่วนใหญ่ควรทำงานให้คุณได้
const alpha = {
id: 1,
temp: 2
};
const beta : {
id: number;
temp: number
} = alpha;
นี่คือวิธีที่ TS จัดการตัวแปรเหล่านี้:
declare let alpha: Record<string, any>;
declare let beta: { id: number; temp: number };
alpha = beta // ok
beta = alpha // error
อย่างที่คุณอาจสังเกต beta สามารถกำหนดค่าให้กับ alpha ได้ ดังนั้นคุณสามารถระบุประเภทชัดเจน Record<string, any> สำหรับวัตถุ alpha
แต่สิ่งนี้ไม่สามารถใช้ในทิศทางตรงกันข้ามได้ - alpha ไม่สามารถกำหนดค่าให้กับ beta ได้เนื่องจาก beta เป็นชนิดย่อยของ alpha
ถือว่า alpha เป็นประเภทหลัก และ beta เป็นประเภทย่อย
