typescript - ทำไมข้อจำกัดของ generic สำหรับคุณสมบัติถึงใช้ไม่ได้กับ interface แต่ใช้ได้กับ type
ดูตัวอย่างโค้ดนี้:
type Constrained<T extends { [K in string]: string }> = T;
type A = {
p: string;
}
interface B {
p: string;
}
type R1 = Constrained<A>; // Why this is OK...
type R2 = Constrained<B>; // ... and this an Error?
สนามเด็กเล่น
ฉันรู้ว่าข้อจำกัดสามารถแสดงออกในรูปแบบที่ต่างออกไปเพื่อหลีกเลี่ยงข้อผิดพลาดได้ เช่น
type Constrained<T extends { [K in keyof T]: string }> = T;
และแนวทางแก้ไขแบบนี้สามารถพบได้ที่นี่หรือที่นี่
คำถามหลักคือ: ทำไม interface จึงล้มเหลว แต่ type กลับไม่ล้มเหลว?
ฉันคาดว่าเป็นเพราะ interface เป็นแบบเปิด-ended (สามารถขยาย/รวมได้)
เนื่องจากข้อความแสดงข้อผิดพลาดเป็นประมาณว่า
ลายเซ็นดัชนีหายไปในประเภท 'B'
ฉันคิดว่า PR นี้เกี่ยวข้อง ในกรณีนั้นมีคำถามอีกข้อเกิดขึ้น:
ประเภทที่ประกาศด้วย type เป็นการแทนประเภทวัตถุลิตเทอรัลหรือไม่?