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

วิธีแก้ไขข้อผิดพลาด 'ไม่สามารถกำหนดค่าได้' ใน Typescript?


ฉันเขียนคลาสง่าย ๆ ข้อผิดพลาดนี้มันไม่มีเหตุผลเลย

class C {
  static find<T extends typeof C>(
    this: T,
    selector?: { [P in keyof InstanceType<T>]?: (InstanceType<T>)[P] },
  ) {
    // error: Type '{ id: 1; }' is not assignable
    /// to type '{ [P in keyof InstanceType<T>]?: InstanceType<T>[P]; }'.ts(2322)
    if (!selector) selector = { id: 1 };

    return Collection.find(selector);
  }

  id: number;
}

ฉันจะแก้มันได้อย่างไร?

คำตอบ #1

ปัญหา คืออาจมีข้อจำกัดในลูก T ที่ไม่มีในพ่อแม่ C สิ่งที่คุณกำลังเผชิญนั้นคล้ายกับสถานการณ์ที่ลูกมีชนิดแคบกว่าพ่อแม่:

type Parent = { id: number; }

type Child = { id: 10 }

type ExtendsParent<T extends Parent> = T;

const p: Parent = { id: 1 };

// Type 'Parent' is not assignable to type 'Child'.
// Types of property 'id' are incompatible.
// Type 'number' is not assignable to type '10'.
const c: ExtendsParent<Child> = p;

เนื่องจากประเภท Child อาจแคบกว่าประเภท Parent เราจึงสามารถกำหนดค่า Child ให้กับ Parent ได้อย่างปลอดภัย แต่เราไม่สามารถกำหนดค่า Parent ให้กับ Child ได้

ในสถานการณ์ของคุณ วิธีแก้ไขที่เป็นไปได้ - หากคุณคิดว่าคุณรู้ดีกว่าตัวคอมไพเลอร์ - คือการใช้การยืนยันประเภทแบบนี้:

selector = { id: 1 } as typeof selector;

นี่คือทั้งหมดข้างต้นในสนามเด็กเล่น (โดยไม่มีสิ่งของ InstanceType เพิ่มเติมทั้งหมด)

คำตอบ #2

มันสามารถเป็นตัวเลือกได้:

class C {
    static find<T extends typeof C>(
        this: T,
        selector?: { [P in keyof InstanceType<T>]?: (InstanceType<T>)[P] } | C,
    ) {
        if (!selector) {
            selector = { id: 1 };
        }

        return Collection.find(selector);
    }

    id: number;
}