ค้นหาเว็บไซต์

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 เป็นประเภทย่อย