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

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 เพราะไม่มีค่าที่เป็นไปได้ใดที่ใช้ได้กับทั้งหมด

คำตอบนี้ถูกสร้างขึ้นเพื่อปิดคำถาม