=== tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts === // Two call or construct signatures are considered identical when they have the same number of type parameters and, considering those // parameters pairwise identical, have identical type parameter constraints, identical number of parameters with identical kind(required, // optional or rest) and types, and identical return types. class B> { >B : B >T : T >Array : T[] constructor(x: T) { return null; } >x : T >T : T >null : null } class C { >C : C >T : T >String : String constructor(x: T) { return null; } >x : T >T : T >null : null } interface I { >I : I >T : T >Number : Number new(x: T): string; >x : T >T : T } interface I2 { >I2 : I2 new(x: T): string; >T : T >Boolean : Boolean >x : T >T : T } var a: { new>(x: T): string } >a : new (x: T) => string >T : T >Array : T[] >x : T >T : T var b = { new(x: T) { return ''; } }; // not a construct signature, function called new >b : { new(x: T): string; } >{ new(x: T) { return ''; } } : { new(x: T): string; } >new : (x: T) => string >T : T >RegExp : RegExp >x : T >T : T >'' : string function foo1b(x: B>); >foo1b : { (x: B): any; (x: B): any; } >x : B >B : B >Array : T[] function foo1b(x: B>); // error >foo1b : { (x: B): any; (x: B): any; } >x : B >B : B >Array : T[] function foo1b(x: any) { } >foo1b : { (x: B): any; (x: B): any; } >x : any function foo1c(x: C); >foo1c : { (x: C): any; (x: C): any; } >x : C >C : C >String : String function foo1c(x: C); // error >foo1c : { (x: C): any; (x: C): any; } >x : C >C : C >String : String function foo1c(x: any) { } >foo1c : { (x: C): any; (x: C): any; } >x : any function foo2(x: I); >foo2 : { (x: I): any; (x: I): any; } >x : I >I : I >Number : Number function foo2(x: I); // error >foo2 : { (x: I): any; (x: I): any; } >x : I >I : I >Number : Number function foo2(x: any) { } >foo2 : { (x: I): any; (x: I): any; } >x : any function foo3(x: typeof a); >foo3 : { (x: new (x: T) => string): any; (x: new (x: T) => string): any; } >x : new (x: T) => string >a : new (x: T) => string function foo3(x: typeof a); // error >foo3 : { (x: new (x: T) => string): any; (x: new (x: T) => string): any; } >x : new (x: T) => string >a : new (x: T) => string function foo3(x: any) { } >foo3 : { (x: new (x: T) => string): any; (x: new (x: T) => string): any; } >x : any function foo4(x: typeof b); >foo4 : { (x: { new(x: T): string; }): any; (x: { new(x: T): string; }): any; } >x : { new(x: T): string; } >b : { new(x: T): string; } function foo4(x: typeof b); // error >foo4 : { (x: { new(x: T): string; }): any; (x: { new(x: T): string; }): any; } >x : { new(x: T): string; } >b : { new(x: T): string; } function foo4(x: any) { } >foo4 : { (x: { new(x: T): string; }): any; (x: { new(x: T): string; }): any; } >x : any function foo8(x: B>); >foo8 : { (x: B): any; (x: I): any; } >x : B >B : B >Array : T[] function foo8(x: I); // ok >foo8 : { (x: B): any; (x: I): any; } >x : I >I : I >Number : Number function foo8(x: any) { } >foo8 : { (x: B): any; (x: I): any; } >x : any function foo9(x: B>); >foo9 : { (x: B): any; (x: C): any; } >x : B >B : B >Array : T[] function foo9(x: C); // error, types are structurally equal >foo9 : { (x: B): any; (x: C): any; } >x : C >C : C >String : String function foo9(x: any) { } >foo9 : { (x: B): any; (x: C): any; } >x : any function foo10(x: B>); >foo10 : { (x: B): any; (x: new (x: T) => string): any; } >x : B >B : B >Array : T[] function foo10(x: typeof a); // ok >foo10 : { (x: B): any; (x: new (x: T) => string): any; } >x : new (x: T) => string >a : new (x: T) => string function foo10(x: any) { } >foo10 : { (x: B): any; (x: new (x: T) => string): any; } >x : any function foo11(x: B>); >foo11 : { (x: B): any; (x: { new(x: T): string; }): any; } >x : B >B : B >Array : T[] function foo11(x: typeof b); // ok >foo11 : { (x: B): any; (x: { new(x: T): string; }): any; } >x : { new(x: T): string; } >b : { new(x: T): string; } function foo11(x: any) { } >foo11 : { (x: B): any; (x: { new(x: T): string; }): any; } >x : any function foo12(x: I); >foo12 : { (x: I): any; (x: C): any; } >x : I >I : I >Number : Number function foo12(x: C); // ok >foo12 : { (x: I): any; (x: C): any; } >x : C >C : C >String : String function foo12(x: any) { } >foo12 : { (x: I): any; (x: C): any; } >x : any function foo12b(x: I2); >foo12b : { (x: I2): any; (x: C): any; } >x : I2 >I2 : I2 function foo12b(x: C); // ok >foo12b : { (x: I2): any; (x: C): any; } >x : C >C : C >String : String function foo12b(x: any) { } >foo12b : { (x: I2): any; (x: C): any; } >x : any function foo13(x: I); >foo13 : { (x: I): any; (x: new (x: T) => string): any; } >x : I >I : I >Number : Number function foo13(x: typeof a); // ok >foo13 : { (x: I): any; (x: new (x: T) => string): any; } >x : new (x: T) => string >a : new (x: T) => string function foo13(x: any) { } >foo13 : { (x: I): any; (x: new (x: T) => string): any; } >x : any function foo14(x: I); >foo14 : { (x: I): any; (x: { new(x: T): string; }): any; } >x : I >I : I >Number : Number function foo14(x: typeof b); // ok >foo14 : { (x: I): any; (x: { new(x: T): string; }): any; } >x : { new(x: T): string; } >b : { new(x: T): string; } function foo14(x: any) { } >foo14 : { (x: I): any; (x: { new(x: T): string; }): any; } >x : any