Allow Boolean() to be used to perform a null check (#29955)

* Allow Boolean() to be used to perform a null check

* Add missing test case output
This commit is contained in:
Forbes Lindesay 2019-04-30 16:09:31 +01:00 committed by Ryan Cavanaugh
parent be409fad84
commit 3ce3cde493
5 changed files with 124 additions and 1 deletions

2
src/lib/es5.d.ts vendored
View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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))
}
}

View file

@ -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
}
}

View file

@ -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;
}
}