==== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithGenericConstructSignaturesWithOptionalParameters.ts (6 errors) ==== // call signatures in derived types must have the same or fewer optional parameters as the base type module ClassTypeParam { interface Base { a: new () => T; a2: new (x?: T) => T; a3: new (x: T) => T; a4: new (x: T, y?: T) => T; a5: new (x?: T, y?: T) => T; } interface I1 extends Base { a: new () => T; // ok, same T of required params } interface I2 extends Base { a: new (x?: T) => T; // ok, same T of required params } interface I3 extends Base { ~~ !!! Interface 'I3' incorrectly extends interface 'Base': !!! Types of property 'a' are incompatible: !!! Type 'new (x: T) => T' is not assignable to type 'new () => T'. a: new (x: T) => T; // error, too many required params } interface I4 extends Base { a2: new () => T; // ok, same T of required params } interface I5 extends Base { a2: new (x?: T) => T; // ok, same T of required params } interface I6 extends Base { a2: new (x: T) => T; // ok, same number of params } interface I7 extends Base { a3: new () => T; // ok, fewer required params } interface I8 extends Base { a3: new (x?: T) => T; // ok, fewer required params } interface I9 extends Base { a3: new (x: T) => T; // ok, same T of required params } interface I10 extends Base { ~~~ !!! Interface 'I10' incorrectly extends interface 'Base': !!! Types of property 'a3' are incompatible: !!! Type 'new (x: T, y: T) => T' is not assignable to type 'new (x: T) => T'. a3: new (x: T, y: T) => T; // error, too many required params } interface I11 extends Base { a4: new () => T; // ok, fewer required params } interface I12 extends Base { a4: new (x?: T, y?: T) => T; // ok, fewer required params } interface I13 extends Base { a4: new (x: T) => T; // ok, same T of required params } interface I14 extends Base { a4: new (x: T, y: T) => T; // ok, same number of params } interface I15 extends Base { a5: new () => T; // ok, fewer required params } interface I16 extends Base { a5: new (x?: T, y?: T) => T; // ok, fewer required params } interface I17 extends Base { a5: new (x: T) => T; // ok, all present params match } interface I18 extends Base { a5: new (x: T, y: T) => T; // ok, same number of params } } module GenericSignaturesInvalid { // all of these are errors interface Base2 { a: new () => T; a2: new (x?: T) => T; a3: new (x: T) => T; a4: new (x: T, y?: T) => T; a5: new (x?: T, y?: T) => T; } interface I1 extends Base2 { a: new () => T; } interface I2 extends Base2 { a: new (x?: T) => T; } interface I3 extends Base2 { ~~ !!! Interface 'I3' incorrectly extends interface 'Base2': !!! Types of property 'a' are incompatible: !!! Type 'new (x: T) => T' is not assignable to type 'new () => T'. a: new (x: T) => T; } interface I4 extends Base2 { a2: new () => T; } interface I5 extends Base2 { a2: new (x?: T) => T } interface I6 extends Base2 { a2: new (x: T) => T; } interface I7 extends Base2 { a3: new () => T; } interface I8 extends Base2 { a3: new (x?: T) => T; } interface I9 extends Base2 { a3: new (x: T) => T; } interface I10 extends Base2 { ~~~ !!! Interface 'I10' incorrectly extends interface 'Base2': !!! Types of property 'a3' are incompatible: !!! Type 'new (x: T, y: T) => T' is not assignable to type 'new (x: T) => T'. a3: new (x: T, y: T) => T; } interface I11 extends Base2 { a4: new () => T; } interface I12 extends Base2 { a4: new (x?: T, y?: T) => T; } interface I13 extends Base2 { a4: new (x: T) => T; } interface I14 extends Base2 { a4: new (x: T, y: T) => T; } interface I15 extends Base2 { a5: new () => T; } interface I16 extends Base2 { a5: new (x?: T, y?: T) => T; } interface I17 extends Base2 { a5: new (x: T) => T; } interface I18 extends Base2 { a5: new (x: T, y: T) => T; } } module GenericSignaturesValid { interface Base2 { a: new () => T; a2: new (x?: T) => T; a3: new (x: T) => T; a4: new (x: T, y?: T) => T; a5: new (x?: T, y?: T) => T; } // BUG 833350 interface I1 extends Base2 { a: new () => T; // ok, same number of required params } interface I2 extends Base2 { a: new (x?: T) => T; // error, not identical and contextual signature instatiation can't make inference from T to T } interface I3 extends Base2 { ~~ !!! Interface 'I3' incorrectly extends interface 'Base2': !!! Types of property 'a' are incompatible: !!! Type 'new (x: T) => T' is not assignable to type 'new () => T'. a: new (x: T) => T; // error, not identical and contextual signature instatiation can't make inference from T to T } interface I4 extends Base2 { a2: new () => T; // error, not identical and contextual signature instatiation can't make inference from T to T } interface I5 extends Base2 { a2: new (x?: T) => T; // ok, identical } interface I6 extends Base2 { a2: new (x: T) => T; // ok, same number of params } interface I7 extends Base2 { a3: new () => T; // ok, fewer required params } interface I8 extends Base2 { a3: new (x?: T) => T; // error, no inferences for T so {} not assignable to {} in return type } interface I9 extends Base2 { a3: new (x: T) => T; // ok, identical, same number of required params } interface I10 extends Base2 { ~~~ !!! Interface 'I10' incorrectly extends interface 'Base2': !!! Types of property 'a3' are incompatible: !!! Type 'new (x: T, y: T) => T' is not assignable to type 'new (x: T) => T'. a3: new (x: T, y: T) => T; // error, too many required params } interface I11 extends Base2 { a4: new () => T; // error, not identical and contextual signature instatiation can't make inference from T to T } interface I12 extends Base2 { a4: new (x?: T, y?: T) => T; // ok, fewer required params } interface I13 extends Base2 { a4: new (x: T) => T; // ok, same T of required params } interface I14 extends Base2 { a4: new (x: T, y: T) => T; // ok, same number of params } interface I15 extends Base2 { a5: new () => T; // error, not identical and contextual signature instatiation can't make inference from T to T } interface I16 extends Base2 { a5: new (x?: T, y?: T) => T; // ok, fewer required params } interface I17 extends Base2 { a5: new (x: T) => T; // ok, all present params match } interface I18 extends Base2 { a5: new (x: T, y: T) => T; // ok, same number of params } }