=== 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 >"string" : string >typeof strOrNumOrBool !== "number" : boolean >typeof strOrNumOrBool : string >strOrNumOrBool : number | boolean >"number" : string 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 >"string" : string >typeof strOrNumOrBoolOrC !== "number" : boolean >typeof strOrNumOrBoolOrC : string >strOrNumOrBoolOrC : number | boolean | C >"number" : string >typeof strOrNumOrBoolOrC !== "boolean" : boolean >typeof strOrNumOrBoolOrC : string >strOrNumOrBoolOrC : boolean | C >"boolean" : string 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 >"string" : string >typeof strOrNumOrBoolOrC !== "number" : boolean >typeof strOrNumOrBoolOrC : string >strOrNumOrBoolOrC : number | boolean | C >"number" : string >typeof strOrNumOrBool === "boolean" : boolean >typeof strOrNumOrBool : string >strOrNumOrBool : string | number | boolean >"boolean" : string 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 >"string" : string >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 }