diff --git a/tests/baselines/reference/genericFunctionParameters.js b/tests/baselines/reference/genericFunctionParameters.js new file mode 100644 index 00000000000..55f4196e77b --- /dev/null +++ b/tests/baselines/reference/genericFunctionParameters.js @@ -0,0 +1,34 @@ +//// [genericFunctionParameters.ts] +declare function f1(cb: (x: S) => T): T; +declare function f2(cb: (x: S) => T): T; +declare function f3(cb: >(x: S) => T): T; + +let x1 = f1(x => x); // {} +let x2 = f2(x => x); // number +let x3 = f3(x => x); // Array + +// Repro from #19345 + +declare const s: (go: (ops: { init(): S; }) => R) => R; +const x = s(a => a.init()); // x is any, should have been {} + + +//// [genericFunctionParameters.js] +"use strict"; +var x1 = f1(function (x) { return x; }); // {} +var x2 = f2(function (x) { return x; }); // number +var x3 = f3(function (x) { return x; }); // Array +var x = s(function (a) { return a.init(); }); // x is any, should have been {} + + +//// [genericFunctionParameters.d.ts] +declare function f1(cb: (x: S) => T): T; +declare function f2(cb: (x: S) => T): T; +declare function f3(cb: >(x: S) => T): T; +declare let x1: {}; +declare let x2: number; +declare let x3: any[]; +declare const s: (go: (ops: { + init(): S; +}) => R) => R; +declare const x: {}; diff --git a/tests/baselines/reference/genericFunctionParameters.symbols b/tests/baselines/reference/genericFunctionParameters.symbols new file mode 100644 index 00000000000..c5955949289 --- /dev/null +++ b/tests/baselines/reference/genericFunctionParameters.symbols @@ -0,0 +1,72 @@ +=== tests/cases/conformance/types/typeRelationships/typeInference/genericFunctionParameters.ts === +declare function f1(cb: (x: S) => T): T; +>f1 : Symbol(f1, Decl(genericFunctionParameters.ts, 0, 0)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 0, 20)) +>cb : Symbol(cb, Decl(genericFunctionParameters.ts, 0, 23)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 0, 28)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 0, 31)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 0, 28)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 0, 20)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 0, 20)) + +declare function f2(cb: (x: S) => T): T; +>f2 : Symbol(f2, Decl(genericFunctionParameters.ts, 0, 46)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 1, 20)) +>cb : Symbol(cb, Decl(genericFunctionParameters.ts, 1, 23)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 1, 28)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 1, 46)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 1, 28)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 1, 20)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 1, 20)) + +declare function f3(cb: >(x: S) => T): T; +>f3 : Symbol(f3, Decl(genericFunctionParameters.ts, 1, 61)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 2, 20)) +>cb : Symbol(cb, Decl(genericFunctionParameters.ts, 2, 23)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 2, 28)) +>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 2, 28)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 2, 48)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 2, 28)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 2, 20)) +>T : Symbol(T, Decl(genericFunctionParameters.ts, 2, 20)) + +let x1 = f1(x => x); // {} +>x1 : Symbol(x1, Decl(genericFunctionParameters.ts, 4, 3)) +>f1 : Symbol(f1, Decl(genericFunctionParameters.ts, 0, 0)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 4, 12)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 4, 12)) + +let x2 = f2(x => x); // number +>x2 : Symbol(x2, Decl(genericFunctionParameters.ts, 5, 3)) +>f2 : Symbol(f2, Decl(genericFunctionParameters.ts, 0, 46)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 5, 12)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 5, 12)) + +let x3 = f3(x => x); // Array +>x3 : Symbol(x3, Decl(genericFunctionParameters.ts, 6, 3)) +>f3 : Symbol(f3, Decl(genericFunctionParameters.ts, 1, 61)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 6, 12)) +>x : Symbol(x, Decl(genericFunctionParameters.ts, 6, 12)) + +// Repro from #19345 + +declare const s: (go: (ops: { init(): S; }) => R) => R; +>s : Symbol(s, Decl(genericFunctionParameters.ts, 10, 13)) +>R : Symbol(R, Decl(genericFunctionParameters.ts, 10, 18)) +>go : Symbol(go, Decl(genericFunctionParameters.ts, 10, 21)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 10, 26)) +>ops : Symbol(ops, Decl(genericFunctionParameters.ts, 10, 29)) +>init : Symbol(init, Decl(genericFunctionParameters.ts, 10, 35)) +>S : Symbol(S, Decl(genericFunctionParameters.ts, 10, 26)) +>R : Symbol(R, Decl(genericFunctionParameters.ts, 10, 18)) +>R : Symbol(R, Decl(genericFunctionParameters.ts, 10, 18)) + +const x = s(a => a.init()); // x is any, should have been {} +>x : Symbol(x, Decl(genericFunctionParameters.ts, 11, 5)) +>s : Symbol(s, Decl(genericFunctionParameters.ts, 10, 13)) +>a : Symbol(a, Decl(genericFunctionParameters.ts, 11, 12)) +>a.init : Symbol(init, Decl(genericFunctionParameters.ts, 10, 35)) +>a : Symbol(a, Decl(genericFunctionParameters.ts, 11, 12)) +>init : Symbol(init, Decl(genericFunctionParameters.ts, 10, 35)) + diff --git a/tests/baselines/reference/genericFunctionParameters.types b/tests/baselines/reference/genericFunctionParameters.types new file mode 100644 index 00000000000..3ae51c83e12 --- /dev/null +++ b/tests/baselines/reference/genericFunctionParameters.types @@ -0,0 +1,81 @@ +=== tests/cases/conformance/types/typeRelationships/typeInference/genericFunctionParameters.ts === +declare function f1(cb: (x: S) => T): T; +>f1 : (cb: (x: S) => T) => T +>T : T +>cb : (x: S) => T +>S : S +>x : S +>S : S +>T : T +>T : T + +declare function f2(cb: (x: S) => T): T; +>f2 : (cb: (x: S) => T) => T +>T : T +>cb : (x: S) => T +>S : S +>x : S +>S : S +>T : T +>T : T + +declare function f3(cb: >(x: S) => T): T; +>f3 : (cb: (x: S) => T) => T +>T : T +>cb : (x: S) => T +>S : S +>Array : T[] +>S : S +>x : S +>S : S +>T : T +>T : T + +let x1 = f1(x => x); // {} +>x1 : {} +>f1(x => x) : {} +>f1 : (cb: (x: S) => T) => T +>x => x : (x: S) => S +>x : S +>x : S + +let x2 = f2(x => x); // number +>x2 : number +>f2(x => x) : number +>f2 : (cb: (x: S) => T) => T +>x => x : (x: S) => S +>x : S +>x : S + +let x3 = f3(x => x); // Array +>x3 : any[] +>f3(x => x) : any[] +>f3 : (cb: (x: S) => T) => T +>x => x : (x: S) => S +>x : S +>x : S + +// Repro from #19345 + +declare const s: (go: (ops: { init(): S; }) => R) => R; +>s : (go: (ops: { init(): S; }) => R) => R +>R : R +>go : (ops: { init(): S; }) => R +>S : S +>ops : { init(): S; } +>init : () => S +>S : S +>R : R +>R : R + +const x = s(a => a.init()); // x is any, should have been {} +>x : {} +>s(a => a.init()) : {} +>s : (go: (ops: { init(): S; }) => R) => R +>a => a.init() : (a: { init(): S; }) => S +>a : { init(): S; } +>a.init() : S +>a.init : () => S +>a : { init(): S; } +>init : () => S + diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericFunctionParameters.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericFunctionParameters.ts new file mode 100644 index 00000000000..e639f6b62b3 --- /dev/null +++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericFunctionParameters.ts @@ -0,0 +1,15 @@ +// @strict: true +// @declaration: true + +declare function f1(cb: (x: S) => T): T; +declare function f2(cb: (x: S) => T): T; +declare function f3(cb: >(x: S) => T): T; + +let x1 = f1(x => x); // {} +let x2 = f2(x => x); // number +let x3 = f3(x => x); // Array + +// Repro from #19345 + +declare const s: (go: (ops: { init(): S; }) => R) => R; +const x = s(a => a.init()); // x is any, should have been {}