วิธีแก้ไขข้อผิดพลาด 'ไม่สามารถกำหนดค่าได้' ใน 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;
}
