=== tests/cases/conformance/types/typeRelationships/typeInference/contextualSignatureInstantiation.ts === // TypeScript Spec, section 4.12.2: // If e is an expression of a function type that contains exactly one generic call signature and no other members, // and T is a function type with exactly one non - generic call signature and no other members, then any inferences // made for type parameters referenced by the parameters of T's call signature are fixed, and e's type is changed // to a function type with e's call signature instantiated in the context of T's call signature (section 3.8.5). declare function foo(cb: (x: number, y: string) => T): T; >foo : Symbol(foo, Decl(contextualSignatureInstantiation.ts, 0, 0)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 6, 21)) >cb : Symbol(cb, Decl(contextualSignatureInstantiation.ts, 6, 24)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 6, 29)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 6, 39)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 6, 21)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 6, 21)) declare function bar(x: T, y: U, cb: (x: T, y: U) => V): V; >bar : Symbol(bar, Decl(contextualSignatureInstantiation.ts, 6, 60)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 7, 21)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 7, 23)) >V : Symbol(V, Decl(contextualSignatureInstantiation.ts, 7, 26)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 7, 30)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 7, 21)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 7, 35)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 7, 23)) >cb : Symbol(cb, Decl(contextualSignatureInstantiation.ts, 7, 41)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 7, 47)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 7, 21)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 7, 52)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 7, 23)) >V : Symbol(V, Decl(contextualSignatureInstantiation.ts, 7, 26)) >V : Symbol(V, Decl(contextualSignatureInstantiation.ts, 7, 26)) declare function baz(x: T, y: T, cb: (x: T, y: T) => U): U; >baz : Symbol(baz, Decl(contextualSignatureInstantiation.ts, 7, 68)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 8, 21)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 8, 23)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 8, 27)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 8, 21)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 8, 32)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 8, 21)) >cb : Symbol(cb, Decl(contextualSignatureInstantiation.ts, 8, 38)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 8, 44)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 8, 21)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 8, 49)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 8, 21)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 8, 23)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 8, 23)) declare function g(x: T, y: T): T; >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 10, 19)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 10, 22)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 10, 19)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 10, 27)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 10, 19)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 10, 19)) declare function h(x: T, y: U): T[] | U[]; >h : Symbol(h, Decl(contextualSignatureInstantiation.ts, 10, 37)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 11, 19)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 11, 21)) >x : Symbol(x, Decl(contextualSignatureInstantiation.ts, 11, 25)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 11, 19)) >y : Symbol(y, Decl(contextualSignatureInstantiation.ts, 11, 30)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 11, 21)) >T : Symbol(T, Decl(contextualSignatureInstantiation.ts, 11, 19)) >U : Symbol(U, Decl(contextualSignatureInstantiation.ts, 11, 21)) var a: number; >a : Symbol(a, Decl(contextualSignatureInstantiation.ts, 13, 3), Decl(contextualSignatureInstantiation.ts, 14, 3), Decl(contextualSignatureInstantiation.ts, 15, 3)) var a = bar(1, 1, g); // Should be number >a : Symbol(a, Decl(contextualSignatureInstantiation.ts, 13, 3), Decl(contextualSignatureInstantiation.ts, 14, 3), Decl(contextualSignatureInstantiation.ts, 15, 3)) >bar : Symbol(bar, Decl(contextualSignatureInstantiation.ts, 6, 60)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) var a = baz(1, 1, g); // Should be number >a : Symbol(a, Decl(contextualSignatureInstantiation.ts, 13, 3), Decl(contextualSignatureInstantiation.ts, 14, 3), Decl(contextualSignatureInstantiation.ts, 15, 3)) >baz : Symbol(baz, Decl(contextualSignatureInstantiation.ts, 7, 68)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) var b: number | string; >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) var b = foo(g); // Should be number | string >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) >foo : Symbol(foo, Decl(contextualSignatureInstantiation.ts, 0, 0)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) var b = bar(1, "one", g); // Should be number | string >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) >bar : Symbol(bar, Decl(contextualSignatureInstantiation.ts, 6, 60)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) var b = bar("one", 1, g); // Should be number | string >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) >bar : Symbol(bar, Decl(contextualSignatureInstantiation.ts, 6, 60)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) var b = baz(b, b, g); // Should be number | string >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) >baz : Symbol(baz, Decl(contextualSignatureInstantiation.ts, 7, 68)) >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) >b : Symbol(b, Decl(contextualSignatureInstantiation.ts, 17, 3), Decl(contextualSignatureInstantiation.ts, 18, 3), Decl(contextualSignatureInstantiation.ts, 19, 3), Decl(contextualSignatureInstantiation.ts, 20, 3), Decl(contextualSignatureInstantiation.ts, 21, 3)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65)) var d: number[] | string[]; >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) var d = foo(h); // Should be number[] | string[] >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) >foo : Symbol(foo, Decl(contextualSignatureInstantiation.ts, 0, 0)) >h : Symbol(h, Decl(contextualSignatureInstantiation.ts, 10, 37)) var d = bar(1, "one", h); // Should be number[] | string[] >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) >bar : Symbol(bar, Decl(contextualSignatureInstantiation.ts, 6, 60)) >h : Symbol(h, Decl(contextualSignatureInstantiation.ts, 10, 37)) var d = bar("one", 1, h); // Should be number[] | string[] >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) >bar : Symbol(bar, Decl(contextualSignatureInstantiation.ts, 6, 60)) >h : Symbol(h, Decl(contextualSignatureInstantiation.ts, 10, 37)) var d = baz(d, d, g); // Should be number[] | string[] >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) >baz : Symbol(baz, Decl(contextualSignatureInstantiation.ts, 7, 68)) >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) >d : Symbol(d, Decl(contextualSignatureInstantiation.ts, 23, 3), Decl(contextualSignatureInstantiation.ts, 24, 3), Decl(contextualSignatureInstantiation.ts, 25, 3), Decl(contextualSignatureInstantiation.ts, 26, 3), Decl(contextualSignatureInstantiation.ts, 27, 3)) >g : Symbol(g, Decl(contextualSignatureInstantiation.ts, 8, 65))