From 1a03e5340ae0b83ce1b1f743763625f89e92ca91 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Tue, 27 Aug 2024 10:28:21 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Pick=20PR=20#59761=20(`this`=20c?= =?UTF-8?q?an=20be=20nullish)=20into=20release-5.6=20(#59762)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ryan Cavanaugh --- src/compiler/checker.ts | 1 + .../reference/predicateSemantics.errors.txt | 6 +++++- tests/baselines/reference/predicateSemantics.js | 10 +++++++++- .../reference/predicateSemantics.symbols | 9 +++++++++ .../baselines/reference/predicateSemantics.types | 15 +++++++++++++++ tests/cases/compiler/predicateSemantics.ts | 5 +++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 91346429b17..e3350d48bdf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -39725,6 +39725,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { case SyntaxKind.NewExpression: case SyntaxKind.PropertyAccessExpression: case SyntaxKind.YieldExpression: + case SyntaxKind.ThisKeyword: return PredicateSemantics.Sometimes; case SyntaxKind.BinaryExpression: // List of operators that can produce null/undefined: diff --git a/tests/baselines/reference/predicateSemantics.errors.txt b/tests/baselines/reference/predicateSemantics.errors.txt index 883ce457098..14251121358 100644 --- a/tests/baselines/reference/predicateSemantics.errors.txt +++ b/tests/baselines/reference/predicateSemantics.errors.txt @@ -73,4 +73,8 @@ predicateSemantics.ts(36,8): error TS2872: This kind of expression is always tru // Should be OK console.log((cond || undefined) && 1 / cond); - \ No newline at end of file + + function foo(this: Object | undefined) { + // Should be OK + return this ?? 0; + } \ No newline at end of file diff --git a/tests/baselines/reference/predicateSemantics.js b/tests/baselines/reference/predicateSemantics.js index 4ed29418933..eb0b66516b6 100644 --- a/tests/baselines/reference/predicateSemantics.js +++ b/tests/baselines/reference/predicateSemantics.js @@ -40,7 +40,11 @@ while ((({}))) { } // Should be OK console.log((cond || undefined) && 1 / cond); - + +function foo(this: Object | undefined) { + // Should be OK + return this ?? 0; +} //// [predicateSemantics.js] var _a, _b, _c, _d, _e, _f; @@ -80,3 +84,7 @@ while (({})) { } while ((({}))) { } // Should be OK console.log((cond || undefined) && 1 / cond); +function foo() { + // Should be OK + return this !== null && this !== void 0 ? this : 0; +} diff --git a/tests/baselines/reference/predicateSemantics.symbols b/tests/baselines/reference/predicateSemantics.symbols index 39ce291427a..790e965f988 100644 --- a/tests/baselines/reference/predicateSemantics.symbols +++ b/tests/baselines/reference/predicateSemantics.symbols @@ -70,3 +70,12 @@ console.log((cond || undefined) && 1 / cond); >undefined : Symbol(undefined) >cond : Symbol(cond, Decl(predicateSemantics.ts, 0, 11)) +function foo(this: Object | undefined) { +>foo : Symbol(foo, Decl(predicateSemantics.ts, 38, 45)) +>this : Symbol(this, Decl(predicateSemantics.ts, 40, 13)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + + // Should be OK + return this ?? 0; +>this : Symbol(this, Decl(predicateSemantics.ts, 40, 13)) +} diff --git a/tests/baselines/reference/predicateSemantics.types b/tests/baselines/reference/predicateSemantics.types index b4f418ce339..3d3eba6683e 100644 --- a/tests/baselines/reference/predicateSemantics.types +++ b/tests/baselines/reference/predicateSemantics.types @@ -219,3 +219,18 @@ console.log((cond || undefined) && 1 / cond); >cond : any > : ^^^ +function foo(this: Object | undefined) { +>foo : (this: Object | undefined) => Object | 0 +> : ^ ^^ ^^^^^^^^^^^^^^^ +>this : Object +> : ^^^^^^ + + // Should be OK + return this ?? 0; +>this ?? 0 : 0 | Object +> : ^^^^^^^^^^ +>this : Object +> : ^^^^^^ +>0 : 0 +> : ^ +} diff --git a/tests/cases/compiler/predicateSemantics.ts b/tests/cases/compiler/predicateSemantics.ts index 4069c1da6ee..d6e12b297b2 100644 --- a/tests/cases/compiler/predicateSemantics.ts +++ b/tests/cases/compiler/predicateSemantics.ts @@ -37,3 +37,8 @@ while ((({}))) { } // Should be OK console.log((cond || undefined) && 1 / cond); + +function foo(this: Object | undefined) { + // Should be OK + return this ?? 0; +} \ No newline at end of file