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