fix(42133): fix instantiated undefined type from JS initializer (#42662)

This commit is contained in:
Oleksandr T 2021-02-12 03:07:14 +02:00 committed by GitHub
parent c7bac6f2e6
commit 475036950e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 59 additions and 2 deletions

View File

@ -19489,8 +19489,8 @@ namespace ts {
}
function isEmptyArrayLiteralType(type: Type): boolean {
const elementType = isArrayType(type) ? getTypeArguments(type)[0] : undefined;
return elementType === undefinedWideningType || elementType === implicitNeverType;
const elementType = getElementTypeOfArrayType(type);
return strictNullChecks ? elementType === implicitNeverType : elementType === undefinedWideningType;
}
function isTupleLikeType(type: Type): boolean {

View File

@ -72,4 +72,11 @@ tests/cases/conformance/salsa/a.js(37,5): error TS2322: Type '"error"' is not as
u = 'ok'
l.push('ok')
/** @type {(v: unknown) => v is undefined} */
const isUndef = v => v === undefined;
const e = [1, undefined];
// should be undefined[]
const g = e.filter(isUndef);

View File

@ -175,3 +175,22 @@ l.push('ok')
>l : Symbol(l, Decl(a.js, 45, 3))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
/** @type {(v: unknown) => v is undefined} */
const isUndef = v => v === undefined;
>isUndef : Symbol(isUndef, Decl(a.js, 55, 5))
>v : Symbol(v, Decl(a.js, 55, 15))
>v : Symbol(v, Decl(a.js, 55, 15))
>undefined : Symbol(undefined)
const e = [1, undefined];
>e : Symbol(e, Decl(a.js, 56, 5))
>undefined : Symbol(undefined)
// should be undefined[]
const g = e.filter(isUndef);
>g : Symbol(g, Decl(a.js, 59, 5))
>e.filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>e : Symbol(e, Decl(a.js, 56, 5))
>filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>isUndef : Symbol(isUndef, Decl(a.js, 55, 5))

View File

@ -239,3 +239,27 @@ l.push('ok')
>push : (...items: any[]) => number
>'ok' : "ok"
/** @type {(v: unknown) => v is undefined} */
const isUndef = v => v === undefined;
>isUndef : (v: unknown) => v is undefined
>v => v === undefined : (v: unknown) => v is undefined
>v : unknown
>v === undefined : boolean
>v : unknown
>undefined : undefined
const e = [1, undefined];
>e : (number | undefined)[]
>[1, undefined] : (number | undefined)[]
>1 : 1
>undefined : undefined
// should be undefined[]
const g = e.filter(isUndef);
>g : undefined[]
>e.filter(isUndef) : undefined[]
>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)[]; }
>e : (number | undefined)[]
>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)[]; }
>isUndef : (v: unknown) => v is undefined

View File

@ -57,3 +57,10 @@ u = {}
u = 'ok'
l.push('ok')
/** @type {(v: unknown) => v is undefined} */
const isUndef = v => v === undefined;
const e = [1, undefined];
// should be undefined[]
const g = e.filter(isUndef);