From c9a03dc65923eb57ae258096cc0d40922cbc0236 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 6 Nov 2014 13:00:20 -0800 Subject: [PATCH] =?UTF-8?q?Typeguards=20of=20form=20expr1=20||=20expr2=20?= =?UTF-8?q?=E2=80=A2=09A=20type=20guard=20of=20the=20form=20expr1=20||=20e?= =?UTF-8?q?xpr2=20o=09when=20true,=20narrows=20the=20type=20of=20x=20to=20?= =?UTF-8?q?T1=20|=20T2,=20where=20T1=20is=20the=20type=20of=20x=20narrowed?= =?UTF-8?q?=20by=20expr1=20when=20true,=20and=20T2=20is=20the=20type=20of?= =?UTF-8?q?=20x=20narrowed=20by=20expr1=20when=20false=20and=20then=20by?= =?UTF-8?q?=20expr2=20when=20true,=20or=20o=09when=20false,=20narrows=20th?= =?UTF-8?q?e=20type=20of=20x=20by=20expr1=20when=20false=20and=20then=20by?= =?UTF-8?q?=20expr2=20when=20false.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reference/typeGuardOfFormExpr1OrExpr2.js | 97 ++++++++++++ .../typeGuardOfFormExpr1OrExpr2.types | 140 ++++++++++++++++++ .../typeGuards/typeGuardOfFormExpr1OrExpr2.ts | 46 ++++++ 3 files changed, 283 insertions(+) create mode 100644 tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.js create mode 100644 tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.types create mode 100644 tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts diff --git a/tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.js b/tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.js new file mode 100644 index 00000000000..7e38232a738 --- /dev/null +++ b/tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.js @@ -0,0 +1,97 @@ +//// [typeGuardOfFormExpr1OrExpr2.ts] +var str: string; +var bool: boolean; +var num: number; +var strOrNum: string | number; +var strOrNumOrBool: string | number | boolean; +var numOrBool: number | boolean; +class C { private p; } +var c: C; +var cOrBool: C| boolean; +var strOrNumOrBoolOrC: string | number | boolean | C; + +// A type guard of the form expr1 || expr2 +// - when true, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when true, +// and T2 is the type of x narrowed by expr1 when false and then by expr2 when true, or +// - when false, narrows the type of x by expr1 when false and then by expr2 when false. + +// (typeguard1 || typeguard2) +if (typeof strOrNumOrBool === "string" || typeof strOrNumOrBool === "number") { + strOrNum = strOrNumOrBool; // string | number +} +else { + bool = strOrNumOrBool; // boolean +} +// (typeguard1 || typeguard2 || typeguard3) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBoolOrC === "boolean") { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +} +else { + c = strOrNumOrBoolOrC; // C +} +// (typeguard1 || typeguard2 || typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBool !== "boolean") { + var r1: string | number | boolean | C = strOrNumOrBoolOrC; // string | number | boolean | C + var r2: string | number | boolean = strOrNumOrBool; +} +else { + cOrBool = strOrNumOrBoolOrC; // C | boolean + bool = strOrNumOrBool; // boolean +} +// (typeguard1) || simpleExpr +if (typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool) { + var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean +} +else { + numOrBool = strOrNumOrBool; // number | boolean +} + +//// [typeGuardOfFormExpr1OrExpr2.js] +var str; +var bool; +var num; +var strOrNum; +var strOrNumOrBool; +var numOrBool; +var C = (function () { + function C() { + } + return C; +})(); +var c; +var cOrBool; +var strOrNumOrBoolOrC; +// A type guard of the form expr1 || expr2 +// - when true, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when true, +// and T2 is the type of x narrowed by expr1 when false and then by expr2 when true, or +// - when false, narrows the type of x by expr1 when false and then by expr2 when false. +// (typeguard1 || typeguard2) +if (typeof strOrNumOrBool === "string" || typeof strOrNumOrBool === "number") { + strOrNum = strOrNumOrBool; // string | number +} +else { + bool = strOrNumOrBool; // boolean +} +// (typeguard1 || typeguard2 || typeguard3) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBoolOrC === "boolean") { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +} +else { + c = strOrNumOrBoolOrC; // C +} +// (typeguard1 || typeguard2 || typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBool !== "boolean") { + var r1 = strOrNumOrBoolOrC; // string | number | boolean | C + var r2 = strOrNumOrBool; +} +else { + cOrBool = strOrNumOrBoolOrC; // C | boolean + bool = strOrNumOrBool; // boolean +} +// (typeguard1) || simpleExpr +if (typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool) { + var r3 = strOrNumOrBool; // string | number | boolean +} +else { + numOrBool = strOrNumOrBool; // number | boolean +} diff --git a/tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.types b/tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.types new file mode 100644 index 00000000000..95152a589e5 --- /dev/null +++ b/tests/baselines/reference/typeGuardOfFormExpr1OrExpr2.types @@ -0,0 +1,140 @@ +=== tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts === +var str: string; +>str : string + +var bool: boolean; +>bool : boolean + +var num: number; +>num : number + +var strOrNum: string | number; +>strOrNum : string | number + +var strOrNumOrBool: string | number | boolean; +>strOrNumOrBool : string | number | boolean + +var numOrBool: number | boolean; +>numOrBool : number | boolean + +class C { private p; } +>C : C +>p : any + +var c: C; +>c : C +>C : C + +var cOrBool: C| boolean; +>cOrBool : boolean | C +>C : C + +var strOrNumOrBoolOrC: string | number | boolean | C; +>strOrNumOrBoolOrC : string | number | boolean | C +>C : C + +// A type guard of the form expr1 || expr2 +// - when true, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when true, +// and T2 is the type of x narrowed by expr1 when false and then by expr2 when true, or +// - when false, narrows the type of x by expr1 when false and then by expr2 when false. + +// (typeguard1 || typeguard2) +if (typeof strOrNumOrBool === "string" || typeof strOrNumOrBool === "number") { +>typeof strOrNumOrBool === "string" || typeof strOrNumOrBool === "number" : boolean +>typeof strOrNumOrBool === "string" : boolean +>typeof strOrNumOrBool : string +>strOrNumOrBool : string | number | boolean +>typeof strOrNumOrBool === "number" : boolean +>typeof strOrNumOrBool : string +>strOrNumOrBool : number | boolean + + strOrNum = strOrNumOrBool; // string | number +>strOrNum = strOrNumOrBool : string | number +>strOrNum : string | number +>strOrNumOrBool : string | number +} +else { + bool = strOrNumOrBool; // boolean +>bool = strOrNumOrBool : boolean +>bool : boolean +>strOrNumOrBool : boolean +} +// (typeguard1 || typeguard2 || typeguard3) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBoolOrC === "boolean") { +>typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBoolOrC === "boolean" : boolean +>typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" : boolean +>typeof strOrNumOrBoolOrC === "string" : boolean +>typeof strOrNumOrBoolOrC : string +>strOrNumOrBoolOrC : string | number | boolean | C +>typeof strOrNumOrBoolOrC === "number" : boolean +>typeof strOrNumOrBoolOrC : string +>strOrNumOrBoolOrC : number | boolean | C +>typeof strOrNumOrBoolOrC === "boolean" : boolean +>typeof strOrNumOrBoolOrC : string +>strOrNumOrBoolOrC : boolean | C + + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +>strOrNumOrBool = strOrNumOrBoolOrC : string | number | boolean +>strOrNumOrBool : string | number | boolean +>strOrNumOrBoolOrC : string | number | boolean +} +else { + c = strOrNumOrBoolOrC; // C +>c = strOrNumOrBoolOrC : C +>c : C +>strOrNumOrBoolOrC : C +} +// (typeguard1 || typeguard2 || typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBool !== "boolean") { +>typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBool !== "boolean" : boolean +>typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" : boolean +>typeof strOrNumOrBoolOrC === "string" : boolean +>typeof strOrNumOrBoolOrC : string +>strOrNumOrBoolOrC : string | number | boolean | C +>typeof strOrNumOrBoolOrC === "number" : boolean +>typeof strOrNumOrBoolOrC : string +>strOrNumOrBoolOrC : number | boolean | C +>typeof strOrNumOrBool !== "boolean" : boolean +>typeof strOrNumOrBool : string +>strOrNumOrBool : string | number | boolean + + var r1: string | number | boolean | C = strOrNumOrBoolOrC; // string | number | boolean | C +>r1 : string | number | boolean | C +>C : C +>strOrNumOrBoolOrC : string | number | boolean | C + + var r2: string | number | boolean = strOrNumOrBool; +>r2 : string | number | boolean +>strOrNumOrBool : string | number | boolean +} +else { + cOrBool = strOrNumOrBoolOrC; // C | boolean +>cOrBool = strOrNumOrBoolOrC : boolean | C +>cOrBool : boolean | C +>strOrNumOrBoolOrC : boolean | C + + bool = strOrNumOrBool; // boolean +>bool = strOrNumOrBool : boolean +>bool : boolean +>strOrNumOrBool : boolean +} +// (typeguard1) || simpleExpr +if (typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool) { +>typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool : boolean +>typeof strOrNumOrBool === "string" : boolean +>typeof strOrNumOrBool : string +>strOrNumOrBool : string | number | boolean +>numOrBool !== strOrNumOrBool : boolean +>numOrBool : number | boolean +>strOrNumOrBool : number | boolean + + var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean +>r3 : string | number | boolean +>strOrNumOrBool : string | number | boolean +} +else { + numOrBool = strOrNumOrBool; // number | boolean +>numOrBool = strOrNumOrBool : number | boolean +>numOrBool : number | boolean +>strOrNumOrBool : number | boolean +} diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts new file mode 100644 index 00000000000..1d72f358284 --- /dev/null +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts @@ -0,0 +1,46 @@ +var str: string; +var bool: boolean; +var num: number; +var strOrNum: string | number; +var strOrNumOrBool: string | number | boolean; +var numOrBool: number | boolean; +class C { private p; } +var c: C; +var cOrBool: C| boolean; +var strOrNumOrBoolOrC: string | number | boolean | C; + +// A type guard of the form expr1 || expr2 +// - when true, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when true, +// and T2 is the type of x narrowed by expr1 when false and then by expr2 when true, or +// - when false, narrows the type of x by expr1 when false and then by expr2 when false. + +// (typeguard1 || typeguard2) +if (typeof strOrNumOrBool === "string" || typeof strOrNumOrBool === "number") { + strOrNum = strOrNumOrBool; // string | number +} +else { + bool = strOrNumOrBool; // boolean +} +// (typeguard1 || typeguard2 || typeguard3) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBoolOrC === "boolean") { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +} +else { + c = strOrNumOrBoolOrC; // C +} +// (typeguard1 || typeguard2 || typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC === "string" || typeof strOrNumOrBoolOrC === "number" || typeof strOrNumOrBool !== "boolean") { + var r1: string | number | boolean | C = strOrNumOrBoolOrC; // string | number | boolean | C + var r2: string | number | boolean = strOrNumOrBool; +} +else { + cOrBool = strOrNumOrBoolOrC; // C | boolean + bool = strOrNumOrBool; // boolean +} +// (typeguard1) || simpleExpr +if (typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool) { + var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean +} +else { + numOrBool = strOrNumOrBool; // number | boolean +} \ No newline at end of file