diff --git a/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js new file mode 100644 index 00000000000..1152cd8d8b5 --- /dev/null +++ b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js @@ -0,0 +1,131 @@ +//// [typeGuardsInFunctionAndModuleBlock.ts] +// typeguards are scoped in function/module block + +function foo(x: number | string | boolean) { + return typeof x === "string" + ? x + : function f() { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + } (); +} +function foo2(x: number | string | boolean) { + return typeof x === "string" + ? x + : function f(a: number | boolean) { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + } (x); // x here is narrowed to number | boolean +} +function foo3(x: number | string | boolean) { + return typeof x === "string" + ? x + : (() => { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + })(); +} +function foo4(x: number | string | boolean) { + return typeof x === "string" + ? x + : ((a: number | boolean) => { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + })(x); // x here is narrowed to number | boolean +} +module m { + var x: number | string | boolean; + module m2 { + var b = x; // new scope - number | boolean | string + var y: string; + if (typeof x === "string") { + y = x // string; + } else { + y = typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + } + } +} +module m1 { + var x: number | string | boolean; + module m2.m3 { + var b = x; // new scope - number | boolean | string + var y: string; + if (typeof x === "string") { + y = x // string; + } else { + y = typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + } + } +} + +//// [typeGuardsInFunctionAndModuleBlock.js] +// typeguards are scoped in function/module block +function foo(x) { + return typeof x === "string" ? x : function f() { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" ? x.toString() : x.toString(); // number | string + }(); +} +function foo2(x) { + return typeof x === "string" ? x : function f(a) { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" ? x.toString() : x.toString(); // number | string + }(x); // x here is narrowed to number | boolean +} +function foo3(x) { + return typeof x === "string" ? x : (function () { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" ? x.toString() : x.toString(); // number | string + })(); +} +function foo4(x) { + return typeof x === "string" ? x : (function (a) { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" ? x.toString() : x.toString(); // number | string + })(x); // x here is narrowed to number | boolean +} +var m; +(function (m) { + var x; + var m2; + (function (m2) { + var b = x; // new scope - number | boolean | string + var y; + if (typeof x === "string") { + y = x; // string; + } + else { + y = typeof x === "boolean" ? x.toString() : x.toString(); // number + } + })(m2 || (m2 = {})); +})(m || (m = {})); +var m1; +(function (m1) { + var x; + var m2; + (function (m2) { + var m3; + (function (m3) { + var b = x; // new scope - number | boolean | string + var y; + if (typeof x === "string") { + y = x; // string; + } + else { + y = typeof x === "boolean" ? x.toString() : x.toString(); // number + } + })(m3 = m2.m3 || (m2.m3 = {})); + })(m2 || (m2 = {})); +})(m1 || (m1 = {})); diff --git a/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.types b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.types new file mode 100644 index 00000000000..c1ba1a7d639 --- /dev/null +++ b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.types @@ -0,0 +1,274 @@ +=== tests/cases/conformance/expressions/typeGuards/typeGuardsInFunctionAndModuleBlock.ts === +// typeguards are scoped in function/module block + +function foo(x: number | string | boolean) { +>foo : (x: string | number | boolean) => string +>x : string | number | boolean + + return typeof x === "string" +>typeof x === "string" ? x : function f() { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } () : string +>typeof x === "string" : boolean +>typeof x : string +>x : string | number | boolean + + ? x +>x : string + + : function f() { +>function f() { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } () : string +>function f() { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } : () => string +>f : () => string + + var b = x; // new scope - number | boolean | string +>b : string | number | boolean +>x : string | number | boolean + + return typeof x === "boolean" +>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>typeof x === "boolean" : boolean +>typeof x : string +>x : string | number | boolean + + ? x.toString() // boolean +>x.toString() : string +>x.toString : () => string +>x : boolean +>toString : () => string + + : x.toString(); // number | string +>x.toString() : string +>x.toString : () => string +>x : string | number +>toString : () => string + + } (); +} +function foo2(x: number | string | boolean) { +>foo2 : (x: string | number | boolean) => string +>x : string | number | boolean + + return typeof x === "string" +>typeof x === "string" ? x : function f(a: number | boolean) { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } (x) : string +>typeof x === "string" : boolean +>typeof x : string +>x : string | number | boolean + + ? x +>x : string + + : function f(a: number | boolean) { +>function f(a: number | boolean) { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } (x) : string +>function f(a: number | boolean) { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } : (a: number | boolean) => string +>f : (a: number | boolean) => string +>a : number | boolean + + var b = x; // new scope - number | boolean | string +>b : string | number | boolean +>x : string | number | boolean + + return typeof x === "boolean" +>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>typeof x === "boolean" : boolean +>typeof x : string +>x : string | number | boolean + + ? x.toString() // boolean +>x.toString() : string +>x.toString : () => string +>x : boolean +>toString : () => string + + : x.toString(); // number | string +>x.toString() : string +>x.toString : () => string +>x : string | number +>toString : () => string + + } (x); // x here is narrowed to number | boolean +>x : number | boolean +} +function foo3(x: number | string | boolean) { +>foo3 : (x: string | number | boolean) => string +>x : string | number | boolean + + return typeof x === "string" +>typeof x === "string" ? x : (() => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string })() : string +>typeof x === "string" : boolean +>typeof x : string +>x : string | number | boolean + + ? x +>x : string + + : (() => { +>(() => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string })() : string +>(() => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string }) : () => string +>() => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } : () => string + + var b = x; // new scope - number | boolean | string +>b : string | number | boolean +>x : string | number | boolean + + return typeof x === "boolean" +>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>typeof x === "boolean" : boolean +>typeof x : string +>x : string | number | boolean + + ? x.toString() // boolean +>x.toString() : string +>x.toString : () => string +>x : boolean +>toString : () => string + + : x.toString(); // number | string +>x.toString() : string +>x.toString : () => string +>x : string | number +>toString : () => string + + })(); +} +function foo4(x: number | string | boolean) { +>foo4 : (x: string | number | boolean) => string +>x : string | number | boolean + + return typeof x === "string" +>typeof x === "string" ? x : ((a: number | boolean) => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string })(x) : string +>typeof x === "string" : boolean +>typeof x : string +>x : string | number | boolean + + ? x +>x : string + + : ((a: number | boolean) => { +>((a: number | boolean) => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string })(x) : string +>((a: number | boolean) => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string }) : (a: number | boolean) => string +>(a: number | boolean) => { var b = x; // new scope - number | boolean | string return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number | string } : (a: number | boolean) => string +>a : number | boolean + + var b = x; // new scope - number | boolean | string +>b : string | number | boolean +>x : string | number | boolean + + return typeof x === "boolean" +>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>typeof x === "boolean" : boolean +>typeof x : string +>x : string | number | boolean + + ? x.toString() // boolean +>x.toString() : string +>x.toString : () => string +>x : boolean +>toString : () => string + + : x.toString(); // number | string +>x.toString() : string +>x.toString : () => string +>x : string | number +>toString : () => string + + })(x); // x here is narrowed to number | boolean +>x : number | boolean +} +module m { +>m : typeof m + + var x: number | string | boolean; +>x : string | number | boolean + + module m2 { +>m2 : typeof m2 + + var b = x; // new scope - number | boolean | string +>b : string | number | boolean +>x : string | number | boolean + + var y: string; +>y : string + + if (typeof x === "string") { +>typeof x === "string" : boolean +>typeof x : string +>x : string | number | boolean + + y = x // string; +>y = x : string +>y : string +>x : string + + } else { + y = typeof x === "boolean" +>y = typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>y : string +>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>typeof x === "boolean" : boolean +>typeof x : string +>x : number | boolean + + ? x.toString() // boolean +>x.toString() : string +>x.toString : () => string +>x : boolean +>toString : () => string + + : x.toString(); // number +>x.toString() : string +>x.toString : (radix?: number) => string +>x : number +>toString : (radix?: number) => string + } + } +} +module m1 { +>m1 : typeof m1 + + var x: number | string | boolean; +>x : string | number | boolean + + module m2.m3 { +>m2 : typeof m2 +>m3 : typeof m3 + + var b = x; // new scope - number | boolean | string +>b : string | number | boolean +>x : string | number | boolean + + var y: string; +>y : string + + if (typeof x === "string") { +>typeof x === "string" : boolean +>typeof x : string +>x : string | number | boolean + + y = x // string; +>y = x : string +>y : string +>x : string + + } else { + y = typeof x === "boolean" +>y = typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>y : string +>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string +>typeof x === "boolean" : boolean +>typeof x : string +>x : number | boolean + + ? x.toString() // boolean +>x.toString() : string +>x.toString : () => string +>x : boolean +>toString : () => string + + : x.toString(); // number +>x.toString() : string +>x.toString : (radix?: number) => string +>x : number +>toString : (radix?: number) => string + } + } +} diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInFunctionAndModuleBlock.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInFunctionAndModuleBlock.ts new file mode 100644 index 00000000000..244e9f8fa64 --- /dev/null +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInFunctionAndModuleBlock.ts @@ -0,0 +1,70 @@ +// typeguards are scoped in function/module block + +function foo(x: number | string | boolean) { + return typeof x === "string" + ? x + : function f() { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + } (); +} +function foo2(x: number | string | boolean) { + return typeof x === "string" + ? x + : function f(a: number | boolean) { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + } (x); // x here is narrowed to number | boolean +} +function foo3(x: number | string | boolean) { + return typeof x === "string" + ? x + : (() => { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + })(); +} +function foo4(x: number | string | boolean) { + return typeof x === "string" + ? x + : ((a: number | boolean) => { + var b = x; // new scope - number | boolean | string + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number | string + })(x); // x here is narrowed to number | boolean +} +module m { + var x: number | string | boolean; + module m2 { + var b = x; // new scope - number | boolean | string + var y: string; + if (typeof x === "string") { + y = x // string; + } else { + y = typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + } + } +} +module m1 { + var x: number | string | boolean; + module m2.m3 { + var b = x; // new scope - number | boolean | string + var y: string; + if (typeof x === "string") { + y = x // string; + } else { + y = typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + } + } +} \ No newline at end of file