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 คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับมันได้ที่นี่
