=== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts === // Generic call with constraints infering type parameter from object member properties // No errors expected class Base { >Base : Base x: string; >x : string } class Derived extends Base { >Derived : Derived >Base : Base y: string; >y : string } function f(x: { foo: T; bar: T }) { >f : (x: { foo: T; bar: T; }) => T >T : T >Base : Base >x : { foo: T; bar: T; } >foo : T >T : T >bar : T >T : T var r: T; >r : T >T : T return r; >r : T } var r = f({ foo: new Base(), bar: new Derived() }); >r : Base >f({ foo: new Base(), bar: new Derived() }) : Base >f : (x: { foo: T; bar: T; }) => T >{ foo: new Base(), bar: new Derived() } : { foo: Base; bar: Derived; } >foo : Base >new Base() : Base >Base : typeof Base >bar : Derived >new Derived() : Derived >Derived : typeof Derived var r2 = f({ foo: new Derived(), bar: new Derived() }); >r2 : Derived >f({ foo: new Derived(), bar: new Derived() }) : Derived >f : (x: { foo: T; bar: T; }) => T >{ foo: new Derived(), bar: new Derived() } : { foo: Derived; bar: Derived; } >foo : Derived >new Derived() : Derived >Derived : typeof Derived >bar : Derived >new Derived() : Derived >Derived : typeof Derived interface I { >I : I >T : T a: T; >a : T >T : T } function f2(x: I) { >f2 : (x: I) => T >T : T >Base : Base >x : I >I : I >T : T var r: T; >r : T >T : T return r; >r : T } var i: I; >i : I >I : I >Derived : Derived var r3 = f2(i); >r3 : Derived >f2(i) : Derived >f2 : (x: I) => T >i : I function f3(x: T, y: (a: T) => T) { >f3 : (x: T, y: (a: T) => T) => T >T : T >Base : Base >x : T >T : T >y : (a: T) => T >a : T >T : T >T : T return y(null); >y(null) : T >y : (a: T) => T >null : null } var r4 = f3(new Base(), x => x); >r4 : Base >f3(new Base(), x => x) : Base >f3 : (x: T, y: (a: T) => T) => T >new Base() : Base >Base : typeof Base >x => x : (x: Base) => Base >x : Base >x : Base var r5 = f3(new Derived(), x => x); >r5 : Derived >f3(new Derived(), x => x) : Derived >f3 : (x: T, y: (a: T) => T) => T >new Derived() : Derived >Derived : typeof Derived >x => x : (x: Derived) => Derived >x : Derived >x : Derived var r6 = f3(null, null); // any >r6 : any >f3(null, null) : any >f3 : (x: T, y: (a: T) => T) => T >null : null >null : null var r7 = f3(null, x => x); // any >r7 : any >f3(null, x => x) : any >f3 : (x: T, y: (a: T) => T) => T >null : null >x => x : (x: any) => any >x : any >x : any