Cherry-pick PR #50610 into release-4.8 (#50612)

Component commits:
908548ef90 'in' operator shouldn't narrow {} originating in unknown

517777d3ab Add regression test

Co-authored-by: Anders Hejlsberg <andersh@microsoft.com>
This commit is contained in:
TypeScript Bot
2022-09-02 09:39:19 -07:00
committed by GitHub
co-authored by Anders Hejlsberg
parent 10870b4f3c
commit 4083b464c1
5 changed files with 130 additions and 1 deletions
+1 -1
View File
@@ -25117,7 +25117,7 @@ namespace ts {
function narrowByInKeyword(type: Type, name: __String, assumeTrue: boolean) {
if (type.flags & TypeFlags.Union
|| type.flags & TypeFlags.Object && declaredType !== type
|| type.flags & TypeFlags.Object && declaredType !== type && !(declaredType === unknownType && isEmptyAnonymousObjectType(type))
|| isThisTypeParameter(type)
|| type.flags & TypeFlags.Intersection && every((type as IntersectionType).types, t => t.symbol !== globalThisSymbol)) {
return filterType(type, t => isTypePresencePossible(t, name, assumeTrue));
@@ -0,0 +1,36 @@
//// [inKeywordAndUnknown.ts]
// Repro from #50531
function f(x: {}, y: unknown) {
if (!("a" in x)) {
return;
}
x; // {}
if (!y) {
return;
}
y; // {}
if (!("a" in y)) {
return;
}
y; // {}
}
//// [inKeywordAndUnknown.js]
"use strict";
// Repro from #50531
function f(x, y) {
if (!("a" in x)) {
return;
}
x; // {}
if (!y) {
return;
}
y; // {}
if (!("a" in y)) {
return;
}
y; // {}
}
@@ -0,0 +1,33 @@
=== tests/cases/compiler/inKeywordAndUnknown.ts ===
// Repro from #50531
function f(x: {}, y: unknown) {
>f : Symbol(f, Decl(inKeywordAndUnknown.ts, 0, 0))
>x : Symbol(x, Decl(inKeywordAndUnknown.ts, 2, 11))
>y : Symbol(y, Decl(inKeywordAndUnknown.ts, 2, 17))
if (!("a" in x)) {
>x : Symbol(x, Decl(inKeywordAndUnknown.ts, 2, 11))
return;
}
x; // {}
>x : Symbol(x, Decl(inKeywordAndUnknown.ts, 2, 11))
if (!y) {
>y : Symbol(y, Decl(inKeywordAndUnknown.ts, 2, 17))
return;
}
y; // {}
>y : Symbol(y, Decl(inKeywordAndUnknown.ts, 2, 17))
if (!("a" in y)) {
>y : Symbol(y, Decl(inKeywordAndUnknown.ts, 2, 17))
return;
}
y; // {}
>y : Symbol(y, Decl(inKeywordAndUnknown.ts, 2, 17))
}
@@ -0,0 +1,42 @@
=== tests/cases/compiler/inKeywordAndUnknown.ts ===
// Repro from #50531
function f(x: {}, y: unknown) {
>f : (x: {}, y: unknown) => void
>x : {}
>y : unknown
if (!("a" in x)) {
>!("a" in x) : boolean
>("a" in x) : boolean
>"a" in x : boolean
>"a" : "a"
>x : {}
return;
}
x; // {}
>x : {}
if (!y) {
>!y : boolean
>y : unknown
return;
}
y; // {}
>y : {}
if (!("a" in y)) {
>!("a" in y) : boolean
>("a" in y) : boolean
>"a" in y : boolean
>"a" : "a"
>y : {}
return;
}
y; // {}
>y : {}
}
@@ -0,0 +1,18 @@
// @strict: true
// Repro from #50531
function f(x: {}, y: unknown) {
if (!("a" in x)) {
return;
}
x; // {}
if (!y) {
return;
}
y; // {}
if (!("a" in y)) {
return;
}
y; // {}
}