=== tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithFunctionTypedMemberArguments.ts === // Generic functions used as arguments for function typed parameters are not used to make inferences from // Using function arguments, no errors expected module ImmediatelyFix { >ImmediatelyFix : typeof ImmediatelyFix class C { >C : C foo(x: (a: T) => T) { >foo : (x: (a: T) => T) => T >x : (a: T) => T >a : T return x(null); >x(null) : T >x : (a: T) => T >null : null } } var c = new C(); >c : C >new C() : C >C : typeof C var r = c.foo((x: U) => ''); // {} >r : unknown >c.foo((x: U) => '') : unknown >c.foo : (x: (a: T) => T) => T >c : C >foo : (x: (a: T) => T) => T >(x: U) => '' : (x: U) => string >x : U >'' : "" var r2 = c.foo((x: U) => ''); // string >r2 : string >c.foo((x: U) => '') : string >c.foo : (x: (a: T) => T) => T >c : C >foo : (x: (a: T) => T) => T >(x: U) => '' : (x: U) => string >x : U >'' : "" var r3 = c.foo(x => ''); // {} >r3 : unknown >c.foo(x => '') : unknown >c.foo : (x: (a: T) => T) => T >c : C >foo : (x: (a: T) => T) => T >x => '' : (x: unknown) => string >x : unknown >'' : "" class C2 { >C2 : C2 foo(x: (a: T) => T) { >foo : (x: (a: T) => T) => T >x : (a: T) => T >a : T return x(null); >x(null) : T >x : (a: T) => T >null : null } } var c2 = new C2(); >c2 : C2 >new C2() : C2 >C2 : typeof C2 var ra = c2.foo((x: U) => 1); // number >ra : number >c2.foo((x: U) => 1) : number >c2.foo : (x: (a: number) => number) => number >c2 : C2 >foo : (x: (a: number) => number) => number >(x: U) => 1 : (x: U) => number >x : U >1 : 1 var r3a = c2.foo(x => 1); // number >r3a : number >c2.foo(x => 1) : number >c2.foo : (x: (a: number) => number) => number >c2 : C2 >foo : (x: (a: number) => number) => number >x => 1 : (x: number) => number >x : number >1 : 1 } module WithCandidates { >WithCandidates : typeof WithCandidates class C { >C : C foo2(x: T, cb: (a: T) => U) { >foo2 : (x: T, cb: (a: T) => U) => U >x : T >cb : (a: T) => U >a : T return cb(x); >cb(x) : U >cb : (a: T) => U >x : T } } var c: C; >c : C var r4 = c.foo2(1, function (a: Z) { return '' }); // string, contextual signature instantiation is applied to generic functions >r4 : string >c.foo2(1, function (a: Z) { return '' }) : string >c.foo2 : (x: T, cb: (a: T) => U) => U >c : C >foo2 : (x: T, cb: (a: T) => U) => U >1 : 1 >function (a: Z) { return '' } : (a: Z) => string >a : Z >'' : "" var r5 = c.foo2(1, (a) => ''); // string >r5 : string >c.foo2(1, (a) => '') : string >c.foo2 : (x: T, cb: (a: T) => U) => U >c : C >foo2 : (x: T, cb: (a: T) => U) => U >1 : 1 >(a) => '' : (a: number) => string >a : number >'' : "" var r6 = c.foo2('', (a: Z) => 1); // number >r6 : number >c.foo2('', (a: Z) => 1) : number >c.foo2 : (x: T, cb: (a: T) => U) => U >c : C >foo2 : (x: T, cb: (a: T) => U) => U >'' : "" >(a: Z) => 1 : (a: Z) => number >a : Z >1 : 1 class C2 { >C2 : C2 foo3(x: T, cb: (a: T) => U, y: U) { >foo3 : (x: T, cb: (a: T) => U, y: U) => U >x : T >cb : (a: T) => U >a : T >y : U return cb(x); >cb(x) : U >cb : (a: T) => U >x : T } } var c2: C2; >c2 : C2 var r7 = c2.foo3(1, (a: Z) => '', ''); // string >r7 : string >c2.foo3(1, (a: Z) => '', '') : string >c2.foo3 : (x: number, cb: (a: number) => string, y: string) => string >c2 : C2 >foo3 : (x: number, cb: (a: number) => string, y: string) => string >1 : 1 >(a: Z) => '' : (a: Z) => string >a : Z >'' : "" >'' : "" var r8 = c2.foo3(1, function (a) { return '' }, ''); // string >r8 : string >c2.foo3(1, function (a) { return '' }, '') : string >c2.foo3 : (x: number, cb: (a: number) => string, y: string) => string >c2 : C2 >foo3 : (x: number, cb: (a: number) => string, y: string) => string >1 : 1 >function (a) { return '' } : (a: number) => string >a : number >'' : "" >'' : "" class C3 { >C3 : C3 foo3(x: T, cb: (a: T) => U, y: U) { >foo3 : (x: T, cb: (a: T) => U, y: U) => U >x : T >cb : (a: T) => U >a : T >y : U return cb(x); >cb(x) : U >cb : (a: T) => U >x : T } } var c3: C3; >c3 : C3 function other(t: T, u: U) { >other : (t: T, u: U) => void >t : T >u : U var r10 = c.foo2(1, (x: T) => ''); // error >r10 : string >c.foo2(1, (x: T) => '') : string >c.foo2 : (x: T, cb: (a: T) => U) => U >c : C >foo2 : (x: T, cb: (a: T) => U) => U >1 : 1 >(x: T) => '' : (x: T) => string >x : T >'' : "" var r10 = c.foo2(1, (x) => ''); // string >r10 : string >c.foo2(1, (x) => '') : string >c.foo2 : (x: T, cb: (a: T) => U) => U >c : C >foo2 : (x: T, cb: (a: T) => U) => U >1 : 1 >(x) => '' : (x: number) => string >x : number >'' : "" var r11 = c3.foo3(1, (x: T) => '', ''); // error >r11 : string >c3.foo3(1, (x: T) => '', '') : string >c3.foo3 : (x: T, cb: (a: T) => U, y: U) => U >c3 : C3 >foo3 : (x: T, cb: (a: T) => U, y: U) => U >1 : 1 >(x: T) => '' : (x: T) => string >x : T >'' : "" >'' : "" var r11b = c3.foo3(1, (x: T) => '', 1); // error >r11b : string >c3.foo3(1, (x: T) => '', 1) : string >c3.foo3 : (x: T, cb: (a: T) => U, y: U) => U >c3 : C3 >foo3 : (x: T, cb: (a: T) => U, y: U) => U >1 : 1 >(x: T) => '' : (x: T) => string >x : T >'' : "" >1 : 1 var r12 = c3.foo3(1, function (a) { return '' }, 1); // error >r12 : number >c3.foo3(1, function (a) { return '' }, 1) : 1 >c3.foo3 : (x: T, cb: (a: T) => U, y: U) => U >c3 : C3 >foo3 : (x: T, cb: (a: T) => U, y: U) => U >1 : 1 >function (a) { return '' } : (a: number) => string >a : number >'' : "" >1 : 1 } }