=== tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.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 } module Class { >Class : typeof Class class G { >G : G >T : T >x : string 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 g: G<{ x: string; y: string }>; >g : G<{ x: string; y: string; }> >G : G >x : string >y : string var r = g.foo(c1, d1); >r : C >g.foo(c1, d1) : C >g.foo : (t: X, t2: X) => T >g : G<{ x: string; y: string; }> >foo : (t: X, t2: X) => T >c1 : X >d1 : X var r2 = g.foo(c1, c1); >r2 : C >g.foo(c1, c1) : C >g.foo : (t: X, t2: X) => T >g : G<{ x: string; y: string; }> >foo : (t: X, t2: X) => T >c1 : X >c1 : X class G2 { >G2 : G2 >T : T >C : C 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 g2: G2; >g2 : G2 >G2 : G2 >D : D var r = g2.foo2(c1, d1); >r : C >g2.foo2(c1, d1) : C >g2.foo2 : (t: X, t2: X) => T >g2 : G2 >foo2 : (t: X, t2: X) => T >c1 : X >d1 : X var r2 = g2.foo2(c1, c1); >r2 : C >g2.foo2(c1, c1) : C >g2.foo2 : (t: X, t2: X) => T >g2 : G2 >foo2 : (t: X, t2: X) => T >c1 : X >c1 : X } module Interface { >Interface : typeof Interface interface G { >G : G >T : T >x : string foo(t: X, t2: X): T; >foo : (t: X, t2: X) => T >T : T >x : string >t : X >X : X >T : T >t2 : X >X : X >T : T >T : 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 g: G<{ x: string; y: string }>; >g : G<{ x: string; y: string; }> >G : G >x : string >y : string var r = g.foo(c1, d1); >r : C >g.foo(c1, d1) : C >g.foo : (t: X, t2: X) => T >g : G<{ x: string; y: string; }> >foo : (t: X, t2: X) => T >c1 : X >d1 : X var r2 = g.foo(c1, c1); >r2 : C >g.foo(c1, c1) : C >g.foo : (t: X, t2: X) => T >g : G<{ x: string; y: string; }> >foo : (t: X, t2: X) => T >c1 : X >c1 : X interface G2 { >G2 : G2 >T : T >C : C foo2(t: X, t2: X): T; >foo2 : (t: X, t2: X) => T >T : T >C : C >t : X >X : X >T : T >t2 : X >X : X >T : T >T : T } var g2: G2; >g2 : G2 >G2 : G2 >D : D var r = g2.foo2(c1, d1); >r : C >g2.foo2(c1, d1) : C >g2.foo2 : (t: X, t2: X) => T >g2 : G2 >foo2 : (t: X, t2: X) => T >c1 : X >d1 : X var r2 = g2.foo2(c1, c1); >r2 : C >g2.foo2(c1, c1) : C >g2.foo2 : (t: X, t2: X) => T >g2 : G2 >foo2 : (t: X, t2: X) => T >c1 : X >c1 : X }