Skip to content

Commit 2609521

Browse files
committed
Fix #38608
1 parent 33c3e9e commit 2609521

9 files changed

+206
-10
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20691,7 +20691,7 @@ namespace ts {
2069120691
}
2069220692

2069320693
function narrowByInKeyword(type: Type, literal: LiteralExpression, assumeTrue: boolean) {
20694-
if (type.flags & (TypeFlags.Union | TypeFlags.Object) || isThisTypeParameter(type)) {
20694+
if (type.flags & TypeFlags.Union || type.flags & TypeFlags.Object && declaredType.flags & TypeFlags.Union || isThisTypeParameter(type)) {
2069520695
const propName = escapeLeadingUnderscores(literal.text);
2069620696
return filterType(type, t => isTypePresencePossible(t, propName, assumeTrue));
2069720697
}

tests/baselines/reference/fixSignatureCaching.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ tests/cases/conformance/fixSignatureCaching.ts(284,10): error TS2339: Property '
33
tests/cases/conformance/fixSignatureCaching.ts(293,10): error TS2339: Property 'FALLBACK_PHONE' does not exist on type '{}'.
44
tests/cases/conformance/fixSignatureCaching.ts(294,10): error TS2339: Property 'FALLBACK_TABLET' does not exist on type '{}'.
55
tests/cases/conformance/fixSignatureCaching.ts(295,10): error TS2339: Property 'FALLBACK_MOBILE' does not exist on type '{}'.
6-
tests/cases/conformance/fixSignatureCaching.ts(301,17): error TS2339: Property 'isArray' does not exist on type 'never'.
76
tests/cases/conformance/fixSignatureCaching.ts(330,74): error TS2339: Property 'mobileDetectRules' does not exist on type '{}'.
87
tests/cases/conformance/fixSignatureCaching.ts(369,10): error TS2339: Property 'findMatch' does not exist on type '{}'.
98
tests/cases/conformance/fixSignatureCaching.ts(387,10): error TS2339: Property 'findMatches' does not exist on type '{}'.
@@ -59,7 +58,7 @@ tests/cases/conformance/fixSignatureCaching.ts(981,16): error TS2304: Cannot fin
5958
tests/cases/conformance/fixSignatureCaching.ts(983,44): error TS2339: Property 'MobileDetect' does not exist on type 'Window & typeof globalThis'.
6059

6160

62-
==== tests/cases/conformance/fixSignatureCaching.ts (59 errors) ====
61+
==== tests/cases/conformance/fixSignatureCaching.ts (58 errors) ====
6362
// Repro from #10697
6463

6564
(function (define, undefined) {
@@ -371,8 +370,6 @@ tests/cases/conformance/fixSignatureCaching.ts(983,44): error TS2339: Property '
371370
isArray = 'isArray' in Array
372371
? function (value) { return Object.prototype.toString.call(value) === '[object Array]'; }
373372
: Array.isArray;
374-
~~~~~~~
375-
!!! error TS2339: Property 'isArray' does not exist on type 'never'.
376373

377374
function equalIC(a, b) {
378375
return a != null && b != null && a.toLowerCase() === b.toLowerCase();

tests/baselines/reference/fixSignatureCaching.symbols

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,9 @@ define(function () {
825825
>value : Symbol(value, Decl(fixSignatureCaching.ts, 299, 20))
826826

827827
: Array.isArray;
828+
>Array.isArray : Symbol(ArrayConstructor.isArray, Decl(lib.es5.d.ts, --, --))
828829
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
830+
>isArray : Symbol(ArrayConstructor.isArray, Decl(lib.es5.d.ts, --, --))
829831

830832
function equalIC(a, b) {
831833
>equalIC : Symbol(equalIC, Decl(fixSignatureCaching.ts, 300, 24))

tests/baselines/reference/fixSignatureCaching.types

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,9 +1127,9 @@ define(function () {
11271127
>'[object Array]' : "[object Array]"
11281128

11291129
isArray = 'isArray' in Array
1130-
>isArray = 'isArray' in Array ? function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } : Array.isArray : any
1130+
>isArray = 'isArray' in Array ? function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } : Array.isArray : (value: any) => boolean
11311131
>isArray : any
1132-
>'isArray' in Array ? function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } : Array.isArray : any
1132+
>'isArray' in Array ? function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } : Array.isArray : (value: any) => boolean
11331133
>'isArray' in Array : boolean
11341134
>'isArray' : "isArray"
11351135
>Array : ArrayConstructor
@@ -1150,9 +1150,9 @@ define(function () {
11501150
>'[object Array]' : "[object Array]"
11511151

11521152
: Array.isArray;
1153-
>Array.isArray : any
1154-
>Array : never
1155-
>isArray : any
1153+
>Array.isArray : (arg: any) => arg is any[]
1154+
>Array : ArrayConstructor
1155+
>isArray : (arg: any) => arg is any[]
11561156

11571157
function equalIC(a, b) {
11581158
>equalIC : (a: any, b: any) => boolean

tests/baselines/reference/inKeywordTypeguard.errors.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,26 @@ tests/cases/compiler/inKeywordTypeguard.ts(103,13): error TS2322: Type '{ a: str
168168
!!! error TS2322: Type '{ a: string; } & { b: string; }' is not assignable to type 'never'.
169169
}
170170
}
171+
172+
// Repro from #38608
173+
declare const error: Error;
174+
if ('extra' in error) {
175+
error // Still Error
176+
} else {
177+
error // Error
178+
}
179+
180+
function narrowsToNever(x: { l: number } | { r: number }) {
181+
let v: number;
182+
if ("l" in x) {
183+
v = x.l;
184+
}
185+
else if ("r" in x) {
186+
v = x.r;
187+
}
188+
else {
189+
v = x
190+
}
191+
return v;
192+
}
171193

tests/baselines/reference/inKeywordTypeguard.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,28 @@ function positiveIntersectionTest(x: { a: string } & { b: string }) {
104104
let n: never = x;
105105
}
106106
}
107+
108+
// Repro from #38608
109+
declare const error: Error;
110+
if ('extra' in error) {
111+
error // Still Error
112+
} else {
113+
error // Error
114+
}
115+
116+
function narrowsToNever(x: { l: number } | { r: number }) {
117+
let v: number;
118+
if ("l" in x) {
119+
v = x.l;
120+
}
121+
else if ("r" in x) {
122+
v = x.r;
123+
}
124+
else {
125+
v = x
126+
}
127+
return v;
128+
}
107129

108130

109131
//// [inKeywordTypeguard.js]
@@ -245,3 +267,22 @@ function positiveIntersectionTest(x) {
245267
var n = x;
246268
}
247269
}
270+
if ('extra' in error) {
271+
error; // Still Error
272+
}
273+
else {
274+
error; // Error
275+
}
276+
function narrowsToNever(x) {
277+
var v;
278+
if ("l" in x) {
279+
v = x.l;
280+
}
281+
else if ("r" in x) {
282+
v = x.r;
283+
}
284+
else {
285+
v = x;
286+
}
287+
return v;
288+
}

tests/baselines/reference/inKeywordTypeguard.symbols

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,55 @@ function positiveIntersectionTest(x: { a: string } & { b: string }) {
262262
}
263263
}
264264

265+
// Repro from #38608
266+
declare const error: Error;
267+
>error : Symbol(error, Decl(inKeywordTypeguard.ts, 107, 13))
268+
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
269+
270+
if ('extra' in error) {
271+
>error : Symbol(error, Decl(inKeywordTypeguard.ts, 107, 13))
272+
273+
error // Still Error
274+
>error : Symbol(error, Decl(inKeywordTypeguard.ts, 107, 13))
275+
276+
} else {
277+
error // Error
278+
>error : Symbol(error, Decl(inKeywordTypeguard.ts, 107, 13))
279+
}
280+
281+
function narrowsToNever(x: { l: number } | { r: number }) {
282+
>narrowsToNever : Symbol(narrowsToNever, Decl(inKeywordTypeguard.ts, 112, 1))
283+
>x : Symbol(x, Decl(inKeywordTypeguard.ts, 114, 24))
284+
>l : Symbol(l, Decl(inKeywordTypeguard.ts, 114, 28))
285+
>r : Symbol(r, Decl(inKeywordTypeguard.ts, 114, 44))
286+
287+
let v: number;
288+
>v : Symbol(v, Decl(inKeywordTypeguard.ts, 115, 7))
289+
290+
if ("l" in x) {
291+
>x : Symbol(x, Decl(inKeywordTypeguard.ts, 114, 24))
292+
293+
v = x.l;
294+
>v : Symbol(v, Decl(inKeywordTypeguard.ts, 115, 7))
295+
>x.l : Symbol(l, Decl(inKeywordTypeguard.ts, 114, 28))
296+
>x : Symbol(x, Decl(inKeywordTypeguard.ts, 114, 24))
297+
>l : Symbol(l, Decl(inKeywordTypeguard.ts, 114, 28))
298+
}
299+
else if ("r" in x) {
300+
>x : Symbol(x, Decl(inKeywordTypeguard.ts, 114, 24))
301+
302+
v = x.r;
303+
>v : Symbol(v, Decl(inKeywordTypeguard.ts, 115, 7))
304+
>x.r : Symbol(r, Decl(inKeywordTypeguard.ts, 114, 44))
305+
>x : Symbol(x, Decl(inKeywordTypeguard.ts, 114, 24))
306+
>r : Symbol(r, Decl(inKeywordTypeguard.ts, 114, 44))
307+
}
308+
else {
309+
v = x
310+
>v : Symbol(v, Decl(inKeywordTypeguard.ts, 115, 7))
311+
>x : Symbol(x, Decl(inKeywordTypeguard.ts, 114, 24))
312+
}
313+
return v;
314+
>v : Symbol(v, Decl(inKeywordTypeguard.ts, 115, 7))
315+
}
316+

tests/baselines/reference/inKeywordTypeguard.types

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,3 +322,63 @@ function positiveIntersectionTest(x: { a: string } & { b: string }) {
322322
}
323323
}
324324

325+
// Repro from #38608
326+
declare const error: Error;
327+
>error : Error
328+
329+
if ('extra' in error) {
330+
>'extra' in error : boolean
331+
>'extra' : "extra"
332+
>error : Error
333+
334+
error // Still Error
335+
>error : Error
336+
337+
} else {
338+
error // Error
339+
>error : Error
340+
}
341+
342+
function narrowsToNever(x: { l: number } | { r: number }) {
343+
>narrowsToNever : (x: { l: number;} | { r: number;}) => number
344+
>x : { l: number; } | { r: number; }
345+
>l : number
346+
>r : number
347+
348+
let v: number;
349+
>v : number
350+
351+
if ("l" in x) {
352+
>"l" in x : boolean
353+
>"l" : "l"
354+
>x : { l: number; } | { r: number; }
355+
356+
v = x.l;
357+
>v = x.l : number
358+
>v : number
359+
>x.l : number
360+
>x : { l: number; }
361+
>l : number
362+
}
363+
else if ("r" in x) {
364+
>"r" in x : boolean
365+
>"r" : "r"
366+
>x : { r: number; }
367+
368+
v = x.r;
369+
>v = x.r : number
370+
>v : number
371+
>x.r : number
372+
>x : { r: number; }
373+
>r : number
374+
}
375+
else {
376+
v = x
377+
>v = x : never
378+
>v : number
379+
>x : never
380+
}
381+
return v;
382+
>v : number
383+
}
384+

tests/cases/compiler/inKeywordTypeguard.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,25 @@ function positiveIntersectionTest(x: { a: string } & { b: string }) {
103103
let n: never = x;
104104
}
105105
}
106+
107+
// Repro from #38608
108+
declare const error: Error;
109+
if ('extra' in error) {
110+
error // Still Error
111+
} else {
112+
error // Error
113+
}
114+
115+
function narrowsToNever(x: { l: number } | { r: number }) {
116+
let v: number;
117+
if ("l" in x) {
118+
v = x.l;
119+
}
120+
else if ("r" in x) {
121+
v = x.r;
122+
}
123+
else {
124+
v = x
125+
}
126+
return v;
127+
}

0 commit comments

Comments
 (0)