Skip to content

Commit

Permalink
Allow Boolean() to be used to perform a null check (#29955)
Browse files Browse the repository at this point in the history
* Allow Boolean() to be used to perform a null check

* Add missing test case output
  • Loading branch information
ForbesLindesay authored and RyanCavanaugh committed Apr 30, 2019
1 parent be409fa commit 3ce3cde
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/lib/es5.d.ts
Expand Up @@ -513,7 +513,7 @@ interface Boolean {

interface BooleanConstructor {
new(value?: any): Boolean;
(value?: any): boolean;
<T>(value?: T): value is Exclude<T, false | null | undefined | '' | 0>;
readonly prototype: Boolean;
}

Expand Down
30 changes: 30 additions & 0 deletions tests/baselines/reference/typeGuardBoolean.js
@@ -0,0 +1,30 @@
//// [typeGuardBoolean.ts]
function test(strOrNull: string | null, strOrUndefined: string | undefined) {
var str: string = "original";
var nil: null;
if (!Boolean(strOrNull)) {
nil = strOrNull;
}
else {
str = strOrNull;
}
if (Boolean(strOrUndefined)) {
str = strOrUndefined;
}
}


//// [typeGuardBoolean.js]
function test(strOrNull, strOrUndefined) {
var str = "original";
var nil;
if (!Boolean(strOrNull)) {
nil = strOrNull;
}
else {
str = strOrNull;
}
if (Boolean(strOrUndefined)) {
str = strOrUndefined;
}
}
35 changes: 35 additions & 0 deletions tests/baselines/reference/typeGuardBoolean.symbols
@@ -0,0 +1,35 @@
=== tests/cases/conformance/expressions/typeGuards/typeGuardBoolean.ts ===
function test(strOrNull: string | null, strOrUndefined: string | undefined) {
>test : Symbol(test, Decl(typeGuardBoolean.ts, 0, 0))
>strOrNull : Symbol(strOrNull, Decl(typeGuardBoolean.ts, 0, 14))
>strOrUndefined : Symbol(strOrUndefined, Decl(typeGuardBoolean.ts, 0, 39))

var str: string = "original";
>str : Symbol(str, Decl(typeGuardBoolean.ts, 1, 5))

var nil: null;
>nil : Symbol(nil, Decl(typeGuardBoolean.ts, 2, 5))

if (!Boolean(strOrNull)) {
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>strOrNull : Symbol(strOrNull, Decl(typeGuardBoolean.ts, 0, 14))

nil = strOrNull;
>nil : Symbol(nil, Decl(typeGuardBoolean.ts, 2, 5))
>strOrNull : Symbol(strOrNull, Decl(typeGuardBoolean.ts, 0, 14))
}
else {
str = strOrNull;
>str : Symbol(str, Decl(typeGuardBoolean.ts, 1, 5))
>strOrNull : Symbol(strOrNull, Decl(typeGuardBoolean.ts, 0, 14))
}
if (Boolean(strOrUndefined)) {
>Boolean : Symbol(Boolean, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>strOrUndefined : Symbol(strOrUndefined, Decl(typeGuardBoolean.ts, 0, 39))

str = strOrUndefined;
>str : Symbol(str, Decl(typeGuardBoolean.ts, 1, 5))
>strOrUndefined : Symbol(strOrUndefined, Decl(typeGuardBoolean.ts, 0, 39))
}
}

44 changes: 44 additions & 0 deletions tests/baselines/reference/typeGuardBoolean.types
@@ -0,0 +1,44 @@
=== tests/cases/conformance/expressions/typeGuards/typeGuardBoolean.ts ===
function test(strOrNull: string | null, strOrUndefined: string | undefined) {
>test : (strOrNull: string | null, strOrUndefined: string | undefined) => void
>strOrNull : string | null
>null : null
>strOrUndefined : string | undefined

var str: string = "original";
>str : string
>"original" : "original"

var nil: null;
>nil : null
>null : null

if (!Boolean(strOrNull)) {
>!Boolean(strOrNull) : boolean
>Boolean(strOrNull) : boolean
>Boolean : BooleanConstructor
>strOrNull : string | null

nil = strOrNull;
>nil = strOrNull : null
>nil : null
>strOrNull : null
}
else {
str = strOrNull;
>str = strOrNull : string
>str : string
>strOrNull : string
}
if (Boolean(strOrUndefined)) {
>Boolean(strOrUndefined) : boolean
>Boolean : BooleanConstructor
>strOrUndefined : string | undefined

str = strOrUndefined;
>str = strOrUndefined : string
>str : string
>strOrUndefined : string
}
}

14 changes: 14 additions & 0 deletions tests/cases/conformance/expressions/typeGuards/typeGuardBoolean.ts
@@ -0,0 +1,14 @@
// @strictNullChecks: true
function test(strOrNull: string | null, strOrUndefined: string | undefined) {
var str: string = "original";
var nil: null;
if (!Boolean(strOrNull)) {
nil = strOrNull;
}
else {
str = strOrNull;
}
if (Boolean(strOrUndefined)) {
str = strOrUndefined;
}
}

0 comments on commit 3ce3cde

Please sign in to comment.