interface Base { x: T; y: U; } // Error, no Base constructor function class D0 extends Base { } interface BaseConstructor { new (x: string, y: string): Base; new (x: T): Base; new (x: T, y: T): Base; new (x: T, y: U): Base; } declare function getBase(): BaseConstructor; class D1 extends getBase() { constructor() { super("abc", "def"); this.x = "x"; this.y = "y"; } } class D2 extends getBase() { constructor() { super(10); super(10, 20); this.x = 1; this.y = 2; } } class D3 extends getBase() { constructor() { super("abc", 42); this.x = "x"; this.y = 2; } } // Error, no constructors with three type arguments class D4 extends getBase() { } interface BadBaseConstructor { new (x: string): Base; new (x: number): Base; } declare function getBadBase(): BadBaseConstructor; // Error, constructor return types differ class D5 extends getBadBase() { }