=== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts === // Basic type inference with generic calls and constraints, no errors expected class Base { foo: string; } >Base : Base >foo : string class Derived extends Base { bar: string; } >Derived : Derived >Base : Base >bar : string class Derived2 extends Derived { baz: string; } >Derived2 : Derived2 >Derived : Derived >baz : string var b: Base; >b : Base >Base : Base var d1: Derived; >d1 : Derived >Derived : Derived var d2: Derived2; >d2 : Derived2 >Derived2 : Derived2 function foo(t: T) { >foo : (t: T) => T >T : T >Base : Base >t : T >T : T return t; >t : T } var r = foo(b); // Base >r : Base >foo(b) : Base >foo : (t: T) => T >b : Base var r2 = foo(d1); // Derived >r2 : Derived >foo(d1) : Derived >foo : (t: T) => T >d1 : Derived function foo2(t: T, u: U) { >foo2 : (t: T, u: U) => U >T : T >Base : Base >U : U >Derived : Derived >t : T >T : T >u : U >U : U return u; >u : U } function foo2b(u: U) { >foo2b : (u: U) => T >T : T >Base : Base >U : U >Derived : Derived >u : U >U : U var x: T; >x : T >T : T return x; >x : T } function foo2c() { >foo2c : () => T >T : T >Base : Base >U : U >Derived : Derived var x: T; >x : T >T : T return x; >x : T } var r3 = foo2b(d1); // Base >r3 : Base >foo2b(d1) : Base >foo2b : (u: U) => T >d1 : Derived var r3b = foo2c(); // Base >r3b : Base >foo2c() : Base >foo2c : () => T class C { >C : C >T : T >Base : Base >U : U >Derived : Derived constructor(public t: T, public u: U) { >t : T >T : T >u : U >U : U } foo(t: T, u: U) { >foo : (t: T, u: U) => T >t : T >T : T >u : U >U : U return t; >t : T } foo2(t: T, u: U) { >foo2 : (t: T, u: U) => U >t : T >T : T >u : U >U : U return u; >u : U } foo3(t: T, u: U) { >foo3 : (t: T, u: U) => T >T : T >Derived : Derived >t : T >T : T >u : U >U : U return t; >t : T } foo4(t: T, u: U) { >foo4 : (t: T, u: U) => T >U : U >Derived2 : Derived2 >t : T >T : T >u : U >U : U return t; >t : T } foo5(t: T, u: U) { >foo5 : (t: T, u: U) => T >T : T >Derived : Derived >U : U >Derived2 : Derived2 >t : T >T : T >u : U >U : U return t; >t : T } foo6() { >foo6 : () => T >T : T >Derived : Derived >U : U >Derived2 : Derived2 var x: T; >x : T >T : T return x; >x : T } foo7(u: U) { >foo7 : (u: U) => T >T : T >Base : Base >U : U >Derived : Derived >u : U >U : U var x: T; >x : T >T : T return x; >x : T } foo8() { >foo8 : () => T >T : T >Base : Base >U : U >Derived : Derived var x: T; >x : T >T : T return x; >x : T } } var c = new C(b, d1); >c : C >new C(b, d1) : C >C : typeof C >b : Base >d1 : Derived var r4 = c.foo(d1, d2); // Base >r4 : Base >c.foo(d1, d2) : Base >c.foo : (t: Base, u: Derived) => Base >c : C >foo : (t: Base, u: Derived) => Base >d1 : Derived >d2 : Derived2 var r5 = c.foo2(b, d2); // Derived >r5 : Derived >c.foo2(b, d2) : Derived >c.foo2 : (t: Base, u: Derived) => Derived >c : C >foo2 : (t: Base, u: Derived) => Derived >b : Base >d2 : Derived2 var r6 = c.foo3(d1, d1); // Derived >r6 : Derived >c.foo3(d1, d1) : Derived >c.foo3 : (t: T, u: Derived) => T >c : C >foo3 : (t: T, u: Derived) => T >d1 : Derived >d1 : Derived var r7 = c.foo4(d1, d2); // Base >r7 : Base >c.foo4(d1, d2) : Base >c.foo4 : (t: Base, u: U) => Base >c : C >foo4 : (t: Base, u: U) => Base >d1 : Derived >d2 : Derived2 var r8 = c.foo5(d1, d2); // Derived >r8 : Derived >c.foo5(d1, d2) : Derived >c.foo5 : (t: T, u: U) => T >c : C >foo5 : (t: T, u: U) => T >d1 : Derived >d2 : Derived2 var r8b = c.foo5(d2, d2); // Derived2 >r8b : Derived2 >c.foo5(d2, d2) : Derived2 >c.foo5 : (t: T, u: U) => T >c : C >foo5 : (t: T, u: U) => T >d2 : Derived2 >d2 : Derived2 var r9 = c.foo6(); // Derived >r9 : Derived >c.foo6() : Derived >c.foo6 : () => T >c : C >foo6 : () => T var r10 = c.foo7(d1); // Base >r10 : Base >c.foo7(d1) : Base >c.foo7 : (u: U) => T >c : C >foo7 : (u: U) => T >d1 : Derived var r11 = c.foo8(); // Base >r11 : Base >c.foo8() : Base >c.foo8 : () => T >c : C >foo8 : () => T interface I { >I : I >T : T >Base : Base >U : U >Derived : Derived new (t: T, u: U); >t : T >T : T >u : U >U : U foo(t: T, u: U): T; >foo : (t: T, u: U) => T >t : T >T : T >u : U >U : U >T : T foo2(t: T, u: U): U; >foo2 : (t: T, u: U) => U >t : T >T : T >u : U >U : U >U : U foo3(t: T, u: U): T; >foo3 : (t: T, u: U) => T >T : T >Derived : Derived >t : T >T : T >u : U >U : U >T : T foo4(t: T, u: U): T; >foo4 : (t: T, u: U) => T >U : U >Derived2 : Derived2 >t : T >T : T >u : U >U : U >T : T foo5(t: T, u: U): T; >foo5 : (t: T, u: U) => T >T : T >Derived : Derived >U : U >Derived2 : Derived2 >t : T >T : T >u : U >U : U >T : T foo6(): T; >foo6 : () => T >T : T >Derived : Derived >U : U >Derived2 : Derived2 >T : T foo7(u: U): T; >foo7 : (u: U) => T >T : T >Base : Base >U : U >Derived : Derived >u : U >U : U >T : T foo8(): T; >foo8 : () => T >T : T >Base : Base >U : U >Derived : Derived >T : T } var i: I; >i : I >I : I >Base : Base >Derived : Derived var r4 = i.foo(d1, d2); // Base >r4 : Base >i.foo(d1, d2) : Base >i.foo : (t: Base, u: Derived) => Base >i : I >foo : (t: Base, u: Derived) => Base >d1 : Derived >d2 : Derived2 var r5 = i.foo2(b, d2); // Derived >r5 : Derived >i.foo2(b, d2) : Derived >i.foo2 : (t: Base, u: Derived) => Derived >i : I >foo2 : (t: Base, u: Derived) => Derived >b : Base >d2 : Derived2 var r6 = i.foo3(d1, d1); // Derived >r6 : Derived >i.foo3(d1, d1) : Derived >i.foo3 : (t: T, u: Derived) => T >i : I >foo3 : (t: T, u: Derived) => T >d1 : Derived >d1 : Derived var r7 = i.foo4(d1, d2); // Base >r7 : Base >i.foo4(d1, d2) : Base >i.foo4 : (t: Base, u: U) => Base >i : I >foo4 : (t: Base, u: U) => Base >d1 : Derived >d2 : Derived2 var r8 = i.foo5(d1, d2); // Derived >r8 : Derived >i.foo5(d1, d2) : Derived >i.foo5 : (t: T, u: U) => T >i : I >foo5 : (t: T, u: U) => T >d1 : Derived >d2 : Derived2 var r8b = i.foo5(d2, d2); // Derived2 >r8b : Derived2 >i.foo5(d2, d2) : Derived2 >i.foo5 : (t: T, u: U) => T >i : I >foo5 : (t: T, u: U) => T >d2 : Derived2 >d2 : Derived2 var r9 = i.foo6(); // Derived >r9 : Derived >i.foo6() : Derived >i.foo6 : () => T >i : I >foo6 : () => T var r10 = i.foo7(d1); // Base >r10 : Base >i.foo7(d1) : Base >i.foo7 : (u: U) => T >i : I >foo7 : (u: U) => T >d1 : Derived var r11 = i.foo8(); // Base >r11 : Base >i.foo8() : Base >i.foo8 : () => T >i : I >foo8 : () => T