=== tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts === // object types are identical structurally class A { >A : A foo(x: T): T { return null; } >foo : (x: T) => T >T : T >x : T >T : T >T : T >null : null } class B { >B : B >U : U >V : V foo(x: U): U { return null; } >foo : (x: U) => U >x : U >U : U >U : U >null : null } class C { >C : C >V : V >W : W >X : X foo(x: V): V { return null; } >foo : (x: V) => V >x : V >V : V >V : V >null : null } interface I { >I : I >X : X >Y : Y >Z : Z >A : A foo(x: X): X; >foo : (x: X) => X >x : X >X : X >X : X } interface I2 { >I2 : I2 foo(x: Y): Y; >foo : (x: Y) => Y >Y : Y >Z : Z >A : A >B : B >x : Y >Y : Y >Y : Y } var a: { foo(x: Z): Z } >a : { foo(x: Z): Z; } >foo : (x: Z) => Z >Z : Z >A : A >B : B >C : C >D : D >x : Z >Z : Z >Z : Z var b = { foo(x: A) { return x; } }; >b : { foo(x: A): A; } >{ foo(x: A) { return x; } } : { foo(x: A): A; } >foo : (x: A) => A >A : A >B : B >C : C >D : D >E : E >F : F >x : A >A : A >x : A function foo1(x: A); >foo1 : { (x: A): any; (x: A): any; } >x : A >A : A function foo1(x: A); // error >foo1 : { (x: A): any; (x: A): any; } >x : A >A : A function foo1(x: any) { } >foo1 : { (x: A): any; (x: A): any; } >x : any function foo1b(x: B); >foo1b : { (x: B): any; (x: B): any; } >x : B >B : B function foo1b(x: B); // error >foo1b : { (x: B): any; (x: B): any; } >x : B >B : B 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 function foo1c(x: C); // error >foo1c : { (x: C): any; (x: C): any; } >x : C >C : C 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 function foo2(x: I); // error >foo2 : { (x: I): any; (x: I): any; } >x : I >I : I function foo2(x: any) { } >foo2 : { (x: I): any; (x: I): any; } >x : any function foo3(x: typeof a); >foo3 : { (x: { foo(x: Z): Z; }): any; (x: { foo(x: Z): Z; }): any; } >x : { foo(x: Z): Z; } >a : { foo(x: Z): Z; } function foo3(x: typeof a); // error >foo3 : { (x: { foo(x: Z): Z; }): any; (x: { foo(x: Z): Z; }): any; } >x : { foo(x: Z): Z; } >a : { foo(x: Z): Z; } function foo3(x: any) { } >foo3 : { (x: { foo(x: Z): Z; }): any; (x: { foo(x: Z): Z; }): any; } >x : any function foo4(x: typeof b); >foo4 : { (x: { foo(x: A): A; }): any; (x: { foo(x: A): A; }): any; } >x : { foo(x: A): A; } >b : { foo(x: A): A; } function foo4(x: typeof b); // error >foo4 : { (x: { foo(x: A): A; }): any; (x: { foo(x: A): A; }): any; } >x : { foo(x: A): A; } >b : { foo(x: A): A; } function foo4(x: any) { } >foo4 : { (x: { foo(x: A): A; }): any; (x: { foo(x: A): A; }): any; } >x : any function foo5(x: A); >foo5 : { (x: A): any; (x: B): any; } >x : A >A : A function foo5(x: B); // ok >foo5 : { (x: A): any; (x: B): any; } >x : B >B : B function foo5(x: any) { } >foo5 : { (x: A): any; (x: B): any; } >x : any function foo5b(x: A); >foo5b : { (x: A): any; (x: C): any; } >x : A >A : A function foo5b(x: C); // ok >foo5b : { (x: A): any; (x: C): any; } >x : C >C : C function foo5b(x: any) { } >foo5b : { (x: A): any; (x: C): any; } >x : any function foo6(x: A); >foo6 : { (x: A): any; (x: I): any; } >x : A >A : A function foo6(x: I); // ok >foo6 : { (x: A): any; (x: I): any; } >x : I >I : I >Date : Date function foo6(x: any) { } >foo6 : { (x: A): any; (x: I): any; } >x : any function foo7(x: A); >foo7 : { (x: A): any; (x: { foo(x: Z): Z; }): any; } >x : A >A : A function foo7(x: typeof a); // no error, bug? >foo7 : { (x: A): any; (x: { foo(x: Z): Z; }): any; } >x : { foo(x: Z): Z; } >a : { foo(x: Z): Z; } function foo7(x: any) { } >foo7 : { (x: A): any; (x: { foo(x: Z): Z; }): any; } >x : any function foo8(x: B); >foo8 : { (x: B): any; (x: I): any; } >x : B >B : B function foo8(x: I); // error >foo8 : { (x: B): any; (x: I): any; } >x : I >I : I >Date : Date 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 function foo9(x: C>); // error >foo9 : { (x: B): any; (x: C>): any; } >x : C> >C : C >B : B function foo9(x: any) { } >foo9 : { (x: B): any; (x: C>): any; } >x : any function foo10(x: B); >foo10 : { (x: B): any; (x: { foo(x: Z): Z; }): any; } >x : B >B : B function foo10(x: typeof a); // ok >foo10 : { (x: B): any; (x: { foo(x: Z): Z; }): any; } >x : { foo(x: Z): Z; } >a : { foo(x: Z): Z; } function foo10(x: any) { } >foo10 : { (x: B): any; (x: { foo(x: Z): Z; }): any; } >x : any function foo11(x: B); >foo11 : { (x: B): any; (x: { foo(x: A): A; }): any; } >x : B >B : B function foo11(x: typeof b); // ok >foo11 : { (x: B): any; (x: { foo(x: A): A; }): any; } >x : { foo(x: A): A; } >b : { foo(x: A): A; } function foo11(x: any) { } >foo11 : { (x: B): any; (x: { foo(x: A): A; }): any; } >x : any function foo12(x: I, number, Date, string>); >foo12 : { (x: I, number, Date, string>): any; (x: C, number, Date>): any; } >x : I, number, Date, string> >I : I >B : B >Date : Date function foo12(x: C, number, Date>); // error >foo12 : { (x: I, number, Date, string>): any; (x: C, number, Date>): any; } >x : C, number, Date> >C : C >B : B >Date : Date function foo12(x: any) { } >foo12 : { (x: I, number, Date, string>): any; (x: C, number, Date>): 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 function foo12b(x: any) { } >foo12b : { (x: I2): any; (x: C): any; } >x : any function foo13(x: I); >foo13 : { (x: I): any; (x: { foo(x: Z): Z; }): any; } >x : I >I : I >Date : Date >RegExp : RegExp >Date : Date function foo13(x: typeof a); // ok >foo13 : { (x: I): any; (x: { foo(x: Z): Z; }): any; } >x : { foo(x: Z): Z; } >a : { foo(x: Z): Z; } function foo13(x: any) { } >foo13 : { (x: I): any; (x: { foo(x: Z): Z; }): any; } >x : any function foo14(x: I); >foo14 : { (x: I): any; (x: { foo(x: A): A; }): any; } >x : I >I : I >Date : Date >RegExp : RegExp function foo14(x: typeof b); // ok >foo14 : { (x: I): any; (x: { foo(x: A): A; }): any; } >x : { foo(x: A): A; } >b : { foo(x: A): A; } function foo14(x: any) { } >foo14 : { (x: I): any; (x: { foo(x: A): A; }): any; } >x : any function foo15(x: I2); >foo15 : { (x: I2): any; (x: C, B>): any; } >x : I2 >I2 : I2 function foo15(x: C, B>); // ok >foo15 : { (x: I2): any; (x: C, B>): any; } >x : C, B> >C : C >B : B >B : B function foo15(x: any) { } >foo15 : { (x: I2): any; (x: C, B>): any; } >x : any