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

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 เป็นการแทนประเภทวัตถุลิตเทอรัลหรือไม่?