=== tests/cases/conformance/types/typeRelationships/typeInference/genericCallTypeArgumentInference.ts === // Basic type inference with generic calls, no errors expected function foo(t: T) { >foo : (t: T) => T >T : T >t : T >T : T return t; >t : T } var r = foo(''); // string >r : string >foo('') : string >foo : (t: T) => T >'' : string function foo2(t: T, u: U) { >foo2 : (t: T, u: U) => U >T : T >U : U >t : T >T : T >u : U >U : U return u; >u : U } function foo2b(u: U) { >foo2b : (u: U) => T >T : T >U : U >u : U >U : U var x: T; >x : T >T : T return x; >x : T } var r2 = foo2('', 1); // number >r2 : number >foo2('', 1) : number >foo2 : (t: T, u: U) => U >'' : string >1 : number var r3 = foo2b(1); // {} >r3 : {} >foo2b(1) : {} >foo2b : (u: U) => T >1 : number class C { >C : C >T : T >U : U 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 >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 >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 >U : U >t : T >T : T >u : U >U : U return t; >t : T } foo6() { >foo6 : () => T >T : T >U : U var x: T; >x : T >T : T return x; >x : T } foo7(u: U) { >foo7 : (u: U) => T >T : T >U : U >u : U >U : U var x: T; >x : T >T : T return x; >x : T } foo8() { >foo8 : () => T >T : T >U : U var x: T; >x : T >T : T return x; >x : T } } var c = new C('', 1); >c : C >new C('', 1) : C >C : typeof C >'' : string >1 : number var r4 = c.foo('', 1); // string >r4 : string >c.foo('', 1) : string >c.foo : (t: string, u: number) => string >c : C >foo : (t: string, u: number) => string >'' : string >1 : number var r5 = c.foo2('', 1); // number >r5 : number >c.foo2('', 1) : number >c.foo2 : (t: string, u: number) => number >c : C >foo2 : (t: string, u: number) => number >'' : string >1 : number var r6 = c.foo3(true, 1); // boolean >r6 : boolean >c.foo3(true, 1) : boolean >c.foo3 : (t: T, u: number) => T >c : C >foo3 : (t: T, u: number) => T >true : boolean >1 : number var r7 = c.foo4('', true); // string >r7 : string >c.foo4('', true) : string >c.foo4 : (t: string, u: U) => string >c : C >foo4 : (t: string, u: U) => string >'' : string >true : boolean var r8 = c.foo5(true, 1); // boolean >r8 : boolean >c.foo5(true, 1) : boolean >c.foo5 : (t: T, u: U) => T >c : C >foo5 : (t: T, u: U) => T >true : boolean >1 : number var r9 = c.foo6(); // {} >r9 : {} >c.foo6() : {} >c.foo6 : () => T >c : C >foo6 : () => T var r10 = c.foo7(''); // {} >r10 : {} >c.foo7('') : {} >c.foo7 : (u: U) => T >c : C >foo7 : (u: U) => T >'' : string var r11 = c.foo8(); // {} >r11 : {} >c.foo8() : {} >c.foo8 : () => T >c : C >foo8 : () => T interface I { >I : I >T : T >U : U 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 >t : T >T : T >u : U >U : U >T : T foo4(t: T, u: U): T; >foo4 : (t: T, u: U) => T >U : U >t : T >T : T >u : U >U : U >T : T foo5(t: T, u: U): T; >foo5 : (t: T, u: U) => T >T : T >U : U >t : T >T : T >u : U >U : U >T : T foo6(): T; >foo6 : () => T >T : T >U : U >T : T foo7(u: U): T; >foo7 : (u: U) => T >T : T >U : U >u : U >U : U >T : T foo8(): T; >foo8 : () => T >T : T >U : U >T : T } var i: I; >i : I >I : I var r4 = i.foo('', 1); // string >r4 : string >i.foo('', 1) : string >i.foo : (t: string, u: number) => string >i : I >foo : (t: string, u: number) => string >'' : string >1 : number var r5 = i.foo2('', 1); // number >r5 : number >i.foo2('', 1) : number >i.foo2 : (t: string, u: number) => number >i : I >foo2 : (t: string, u: number) => number >'' : string >1 : number var r6 = i.foo3(true, 1); // boolean >r6 : boolean >i.foo3(true, 1) : boolean >i.foo3 : (t: T, u: number) => T >i : I >foo3 : (t: T, u: number) => T >true : boolean >1 : number var r7 = i.foo4('', true); // string >r7 : string >i.foo4('', true) : string >i.foo4 : (t: string, u: U) => string >i : I >foo4 : (t: string, u: U) => string >'' : string >true : boolean var r8 = i.foo5(true, 1); // boolean >r8 : boolean >i.foo5(true, 1) : boolean >i.foo5 : (t: T, u: U) => T >i : I >foo5 : (t: T, u: U) => T >true : boolean >1 : number var r9 = i.foo6(); // {} >r9 : {} >i.foo6() : {} >i.foo6 : () => T >i : I >foo6 : () => T var r10 = i.foo7(''); // {} >r10 : {} >i.foo7('') : {} >i.foo7 : (u: U) => T >i : I >foo7 : (u: U) => T >'' : string var r11 = i.foo8(); // {} >r11 : {} >i.foo8() : {} >i.foo8 : () => T >i : I >foo8 : () => T