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

Typescript: ประเภทสเปรดสามารถสร้างได้เฉพาะจากประเภทวัตถุเท่านั้น


function foo<T extends object>(t: T): T {

  return {
    ...t // Error: [ts] Spread types may only be created from object types.
  }
}

ฉันทราบว่ามีปัญหาใน github แต่ฉันไม่สามารถหาว่าสิ่งใดถูกแก้ไขแล้วและสิ่งใดยังไม่ถูกแก้ไข และพวกเขามีปัญหาเปิดอยู่ 2695 เรื่อง ดังนั้นฉันจึงโพสต์ที่นี่ ฉันกำลังใช้ Typescript 2.9.2 รุ่นล่าสุด

ถ้ารหัสด้านบนไม่ทำงานล่ะ? และฉันจะแก้มันได้อย่างไรถ้าเป็นไปได้?

คำตอบ #1

นี่ได้รับการแก้ไขใน TypeScript เวอร์ชัน 3.2 ดูบันทึกการปล่อยเวอร์ชัน

ดูเหมือนว่าการกระจายด้วยชนิดทั่วไปยังไม่ได้รับการสนับสนุน แต่มีปัญหาเกี่ยวกับเรื่องนี้ใน GitHub: Microsoft/TypeScript#10727.

ตอนนี้คุณสามารถใช้การยืนยันชนิดแบบที่ @Jevgeni แสดงความคิดเห็นได้:

function foo<T extends object>(t: T): T {
  return { ...(t as object) } as T;
}

หรือคุณสามารถใช้ Object.assign ซึ่งมีการกำหนดประเภทอย่างถูกต้อง

function foo<T extends object>(t: T): T {
  return Object.assign({}, t);
}

คำตอบ #2

คุณสามารถใช้ Record<string, unknown> หรืออินเตอร์เฟซเหมือนตัวอย่างด้านล่างนี้:

goodsArray.map(good => {
  return {
    id: good.payload.doc.id,
    ...(good.payload.doc.data() as Record<string, unknown>)
  };
});

หรือ

goodsArray.map(good => {
  return {
    id: good.payload.doc.id,
    ...good.payload.doc.data() as Goods // 'Goods' is my interface name
  };
});

คำตอบ #3

เวอร์ชัน 3.2 ของ Typescript แก้ไขสิ่งนี้แล้ว PR สองรายการที่ปรับปรุงการจัดการพารามิเตอร์แบบ spread และ rest คือ:

  • ตัวแปรและพารามิเตอร์แบบทั่วไปของอ็อบเจ็กต์
  • นิพจน์การกระจายทั่วไปในลิเทอรัลของออบเจ็กต์

คุณสามารถลองใช้ได้ตอนนี้โดยใช้ npm install [email .

ด้วยเวอร์ชัน 3.2 โค้ดของคุณทำงานได้ตามปกติ

เวอร์ชัน 3.2 ได้ถูกปล่อยออกมาเมื่อวันที่ 29 พฤศจิกายน 2018 คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับมันได้ที่นี่

บทความที่เกี่ยวข้อง