typescript - พร็อพเพอร์ตี้ของ Proxy ในตัวตั้งค่ามีประเภทเป็น never (พร้อม MRE)
ด้วย TypeScript 4.5.4 (เวอร์ชันล่าสุดปัจจุบัน) โค้ดนี้ (ดูด้านล่างหรือตาม TypeScript playground) กำลังแสดงข้อผิดพลาด Type 'any' is not assignable to type 'never'.(2322) สำหรับเวอร์ชัน 1,2,3,4 แต่สำหรับเวอร์ชัน 5 และ 6 ไม่รายงานข้อผิดพลาดใด ๆ หากเราลบหนึ่งใน prop num หรือ str ข้อผิดพลาดทั้งหมดก็หายไป
มีคำอธิบายสำหรับการออกแบบนี้ไหม?
const myObj = {
num: -1,
arr: [1, 2, 3],
str: '',
};
const proxy = new Proxy(myObj, {
set(target, prop: keyof typeof myObj, value) {
/* none of these works */
// Ver. 1
if (prop in target) target[prop] = value;
// Ver. 2
target[prop] = value;
// Ver. 3
target[prop as keyof typeof myObj] = value;
// Ver. 4
switch (prop) {
case 'num':
case 'str':
target[prop] = value;
break;
}
/* while these works */
// Ver. 5
switch (prop) {
case 'num':
target[prop] = value;
break;
case 'str':
target[prop] = value;
break;
}
// Ver. 6
switch (prop) {
case 'num':
target[prop] = value;
break;
default:
target[prop] = value;
break;
}
return true;
},
});
console.log('proxy : ', proxy);
คำตอบ #1
สรุป
การเขียนสร้างการตัดกันของประเภทใน TS
โดยละเอียด
นี่คือสำเนาของคำตอบจากรีโปทางการ microsoft/TypeScript#47295 นี่คือฟังก์ชันที่ "ทำงานตามที่ตั้งใจไว้".
ในการตั้งค่าส่วนใหญ่ของคุณ ประเภทของ
propไม่ได้ถูกจำกัดลงจาก"num" | "str" | "arr"; เนื่องจากคุณกำลัง เขียน ลงในtarget[prop]แทนที่จะอ่านจากมัน นั่นจะสร้างการตัดกัน (ไม่ใช่การรวม) ของทุกประเภทที่เป็นไปได้ที่มันอาจอ้างอิง หากไม่มีการทับซ้อน การตัดกันจะยุบลงเป็นneverเพราะไม่มีค่าที่เป็นไปได้ใดที่ใช้ได้กับทั้งหมด
คำตอบนี้ถูกสร้างขึ้นเพื่อปิดคำถาม