From 486d37ec901a9af14994785969f67ed2e28230d2 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 6 Nov 2014 12:59:42 -0800 Subject: [PATCH] =?UTF-8?q?TypeGuard=20of=20for=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=20by=20?= =?UTF-8?q?expr1=20when=20true=20and=20then=20by=20expr2=20when=20true,=20?= =?UTF-8?q?or=20o=09when=20false,=20narrows=20the=20type=20of=20x=20to=20T?= =?UTF-8?q?1=20|=20T2,=20where=20T1=20is=20the=20type=20of=20x=20narrowed?= =?UTF-8?q?=20by=20expr1=20when=20false,=20and=20T2=20is=20the=20type=20of?= =?UTF-8?q?=20x=20narrowed=20by=20expr1=20when=20true=20and=20then=20by=20?= =?UTF-8?q?expr2=20when=20false.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reference/typeGuardOfFormExpr1AndExpr2.js | 97 ++++++++++++ .../typeGuardOfFormExpr1AndExpr2.types | 140 ++++++++++++++++++ .../typeGuardOfFormExpr1AndExpr2.ts | 46 ++++++ 3 files changed, 283 insertions(+) create mode 100644 tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.js create mode 100644 tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.types create mode 100644 tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts diff --git a/tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.js b/tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.js new file mode 100644 index 00000000000..42bab3cdbe7 --- /dev/null +++ b/tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.js @@ -0,0 +1,97 @@ +//// [typeGuardOfFormExpr1AndExpr2.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 by expr1 when true and then by expr2 when true, or +// - when false, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when +// false, and T2 is the type of x narrowed by expr1 when true and then by expr2 when false. + +// (typeguard1 && typeguard2) +if (typeof strOrNumOrBool !== "string" && typeof strOrNumOrBool !== "number") { + bool = strOrNumOrBool; // boolean +} +else { + strOrNum = strOrNumOrBool; // string | number +} +// (typeguard1 && typeguard2 && typeguard3) +if (typeof strOrNumOrBoolOrC !== "string" && typeof strOrNumOrBoolOrC !== "number" && typeof strOrNumOrBoolOrC !== "boolean") { + c = strOrNumOrBoolOrC; // C +} +else { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +} +// (typeguard1 && typeguard2 && typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC !== "string" && typeof strOrNumOrBoolOrC !== "number" && typeof strOrNumOrBool === "boolean") { + cOrBool = strOrNumOrBoolOrC; // C | boolean + bool = strOrNumOrBool; // boolean +} +else { + var r1: string | number | boolean | C = strOrNumOrBoolOrC; // string | number | boolean | C + var r2: string | number | boolean = strOrNumOrBool; +} +// (typeguard1) && simpleExpr +if (typeof strOrNumOrBool !== "string" && numOrBool !== strOrNumOrBool) { + numOrBool = strOrNumOrBool; // number | boolean +} +else { + var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean +} + +//// [typeGuardOfFormExpr1AndExpr2.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 by expr1 when true and then by expr2 when true, or +// - when false, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when +// false, and T2 is the type of x narrowed by expr1 when true and then by expr2 when false. +// (typeguard1 && typeguard2) +if (typeof strOrNumOrBool !== "string" && typeof strOrNumOrBool !== "number") { + bool = strOrNumOrBool; // boolean +} +else { + strOrNum = strOrNumOrBool; // string | number +} +// (typeguard1 && typeguard2 && typeguard3) +if (typeof strOrNumOrBoolOrC !== "string" && typeof strOrNumOrBoolOrC !== "number" && typeof strOrNumOrBoolOrC !== "boolean") { + c = strOrNumOrBoolOrC; // C +} +else { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +} +// (typeguard1 && typeguard2 && typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC !== "string" && typeof strOrNumOrBoolOrC !== "number" && typeof strOrNumOrBool === "boolean") { + cOrBool = strOrNumOrBoolOrC; // C | boolean + bool = strOrNumOrBool; // boolean +} +else { + var r1 = strOrNumOrBoolOrC; // string | number | boolean | C + var r2 = strOrNumOrBool; +} +// (typeguard1) && simpleExpr +if (typeof strOrNumOrBool !== "string" && numOrBool !== strOrNumOrBool) { + numOrBool = strOrNumOrBool; // number | boolean +} +else { + var r3 = strOrNumOrBool; // string | number | boolean +} diff --git a/tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.types b/tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.types new file mode 100644 index 00000000000..f599f1f7ddf --- /dev/null +++ b/tests/baselines/reference/typeGuardOfFormExpr1AndExpr2.types @@ -0,0 +1,140 @@ +=== tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.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 by expr1 when true and then by expr2 when true, or +// - when false, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when +// false, and T2 is the type of x narrowed by expr1 when true 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 + + bool = strOrNumOrBool; // boolean +>bool = strOrNumOrBool : boolean +>bool : boolean +>strOrNumOrBool : boolean +} +else { + strOrNum = strOrNumOrBool; // string | number +>strOrNum = strOrNumOrBool : string | number +>strOrNum : string | number +>strOrNumOrBool : string | number +} +// (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 + + c = strOrNumOrBoolOrC; // C +>c = strOrNumOrBoolOrC : C +>c : C +>strOrNumOrBoolOrC : C +} +else { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +>strOrNumOrBool = strOrNumOrBoolOrC : string | number | boolean +>strOrNumOrBool : string | number | boolean +>strOrNumOrBoolOrC : string | number | boolean +} +// (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 + + cOrBool = strOrNumOrBoolOrC; // C | boolean +>cOrBool = strOrNumOrBoolOrC : boolean | C +>cOrBool : boolean | C +>strOrNumOrBoolOrC : boolean | C + + bool = strOrNumOrBool; // boolean +>bool = strOrNumOrBool : boolean +>bool : boolean +>strOrNumOrBool : boolean +} +else { + 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 +} +// (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 + + numOrBool = strOrNumOrBool; // number | boolean +>numOrBool = strOrNumOrBool : number | boolean +>numOrBool : number | boolean +>strOrNumOrBool : number | boolean +} +else { + var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean +>r3 : string | number | boolean +>strOrNumOrBool : string | number | boolean +} diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts new file mode 100644 index 00000000000..1ed8e6ebb04 --- /dev/null +++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.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 by expr1 when true and then by expr2 when true, or +// - when false, narrows the type of x to T1 | T2, where T1 is the type of x narrowed by expr1 when +// false, and T2 is the type of x narrowed by expr1 when true and then by expr2 when false. + +// (typeguard1 && typeguard2) +if (typeof strOrNumOrBool !== "string" && typeof strOrNumOrBool !== "number") { + bool = strOrNumOrBool; // boolean +} +else { + strOrNum = strOrNumOrBool; // string | number +} +// (typeguard1 && typeguard2 && typeguard3) +if (typeof strOrNumOrBoolOrC !== "string" && typeof strOrNumOrBoolOrC !== "number" && typeof strOrNumOrBoolOrC !== "boolean") { + c = strOrNumOrBoolOrC; // C +} +else { + strOrNumOrBool = strOrNumOrBoolOrC; // string | number | boolean +} +// (typeguard1 && typeguard2 && typeguard11(onAnotherType)) +if (typeof strOrNumOrBoolOrC !== "string" && typeof strOrNumOrBoolOrC !== "number" && typeof strOrNumOrBool === "boolean") { + cOrBool = strOrNumOrBoolOrC; // C | boolean + bool = strOrNumOrBool; // boolean +} +else { + var r1: string | number | boolean | C = strOrNumOrBoolOrC; // string | number | boolean | C + var r2: string | number | boolean = strOrNumOrBool; +} +// (typeguard1) && simpleExpr +if (typeof strOrNumOrBool !== "string" && numOrBool !== strOrNumOrBool) { + numOrBool = strOrNumOrBool; // number | boolean +} +else { + var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean +} \ No newline at end of file