Skip to content

Commit 4750369

Browse files
authored
fix(42133): fix instantiated undefined type from JS initializer (microsoft#42662)
1 parent c7bac6f commit 4750369

File tree

5 files changed

+59
-2
lines changed

5 files changed

+59
-2
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19489,8 +19489,8 @@ namespace ts {
1948919489
}
1949019490

1949119491
function isEmptyArrayLiteralType(type: Type): boolean {
19492-
const elementType = isArrayType(type) ? getTypeArguments(type)[0] : undefined;
19493-
return elementType === undefinedWideningType || elementType === implicitNeverType;
19492+
const elementType = getElementTypeOfArrayType(type);
19493+
return strictNullChecks ? elementType === implicitNeverType : elementType === undefinedWideningType;
1949419494
}
1949519495

1949619496
function isTupleLikeType(type: Type): boolean {

tests/baselines/reference/typeFromJSInitializer.errors.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,11 @@ tests/cases/conformance/salsa/a.js(37,5): error TS2322: Type '"error"' is not as
7272
u = 'ok'
7373

7474
l.push('ok')
75+
76+
/** @type {(v: unknown) => v is undefined} */
77+
const isUndef = v => v === undefined;
78+
const e = [1, undefined];
79+
80+
// should be undefined[]
81+
const g = e.filter(isUndef);
7582

tests/baselines/reference/typeFromJSInitializer.symbols

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,22 @@ l.push('ok')
175175
>l : Symbol(l, Decl(a.js, 45, 3))
176176
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
177177

178+
/** @type {(v: unknown) => v is undefined} */
179+
const isUndef = v => v === undefined;
180+
>isUndef : Symbol(isUndef, Decl(a.js, 55, 5))
181+
>v : Symbol(v, Decl(a.js, 55, 15))
182+
>v : Symbol(v, Decl(a.js, 55, 15))
183+
>undefined : Symbol(undefined)
184+
185+
const e = [1, undefined];
186+
>e : Symbol(e, Decl(a.js, 56, 5))
187+
>undefined : Symbol(undefined)
188+
189+
// should be undefined[]
190+
const g = e.filter(isUndef);
191+
>g : Symbol(g, Decl(a.js, 59, 5))
192+
>e.filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
193+
>e : Symbol(e, Decl(a.js, 56, 5))
194+
>filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
195+
>isUndef : Symbol(isUndef, Decl(a.js, 55, 5))
196+

tests/baselines/reference/typeFromJSInitializer.types

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,27 @@ l.push('ok')
239239
>push : (...items: any[]) => number
240240
>'ok' : "ok"
241241

242+
/** @type {(v: unknown) => v is undefined} */
243+
const isUndef = v => v === undefined;
244+
>isUndef : (v: unknown) => v is undefined
245+
>v => v === undefined : (v: unknown) => v is undefined
246+
>v : unknown
247+
>v === undefined : boolean
248+
>v : unknown
249+
>undefined : undefined
250+
251+
const e = [1, undefined];
252+
>e : (number | undefined)[]
253+
>[1, undefined] : (number | undefined)[]
254+
>1 : 1
255+
>undefined : undefined
256+
257+
// should be undefined[]
258+
const g = e.filter(isUndef);
259+
>g : undefined[]
260+
>e.filter(isUndef) : undefined[]
261+
>e.filter : { <S extends number | undefined>(predicate: (value: number | undefined, index: number, array: (number | undefined)[]) => value is S, thisArg?: any): S[]; (predicate: (value: number | undefined, index: number, array: (number | undefined)[]) => unknown, thisArg?: any): (number | undefined)[]; }
262+
>e : (number | undefined)[]
263+
>filter : { <S extends number | undefined>(predicate: (value: number | undefined, index: number, array: (number | undefined)[]) => value is S, thisArg?: any): S[]; (predicate: (value: number | undefined, index: number, array: (number | undefined)[]) => unknown, thisArg?: any): (number | undefined)[]; }
264+
>isUndef : (v: unknown) => v is undefined
265+

tests/cases/conformance/salsa/typeFromJSInitializer.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,10 @@ u = {}
5757
u = 'ok'
5858

5959
l.push('ok')
60+
61+
/** @type {(v: unknown) => v is undefined} */
62+
const isUndef = v => v === undefined;
63+
const e = [1, undefined];
64+
65+
// should be undefined[]
66+
const g = e.filter(isUndef);

0 commit comments

Comments
 (0)