=== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts === // Generic call with constraints infering type parameter from object member properties // No errors expected class C { >C : C x: string; >x : string } class D { >D : D x: string; >x : string y: string; >y : string } class X { >X : X >T : T x: T; >x : T >T : T } function foo(t: X, t2: X) { >foo : (t: X, t2: X) => T >T : T >x : string >t : X >X : X >T : T >t2 : X >X : X >T : T var x: T; >x : T >T : T return x; >x : T } var c1 = new X(); >c1 : X >new X() : X >X : typeof X >C : C var d1 = new X(); >d1 : X >new X() : X >X : typeof X >D : D var r = foo(c1, d1); >r : C >foo(c1, d1) : C >foo : (t: X, t2: X) => T >c1 : X >d1 : X var r2 = foo(c1, c1); >r2 : C >foo(c1, c1) : C >foo : (t: X, t2: X) => T >c1 : X >c1 : X function foo2(t: X, t2: X) { >foo2 : (t: X, t2: X) => T >T : T >C : C >t : X >X : X >T : T >t2 : X >X : X >T : T var x: T; >x : T >T : T return x; >x : T } var r = foo2(c1, d1); >r : C >foo2(c1, d1) : C >foo2 : (t: X, t2: X) => T >c1 : X >d1 : X var r2 = foo2(c1, c1); >r2 : C >foo2(c1, c1) : C >foo2 : (t: X, t2: X) => T >c1 : X >c1 : X