mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Component commits:908548ef90'in' operator shouldn't narrow {} originating in unknown517777d3abAdd regression test Co-authored-by: Anders Hejlsberg <andersh@microsoft.com>
This commit is contained in:
co-authored by
Anders Hejlsberg
parent
10870b4f3c
commit
4083b464c1
@@ -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; // {}
|
||||
}
|
||||
Reference in New Issue
Block a user