Undo #39258 (isArray changes) see overview at #41808 (#41851)

This commit is contained in:
Orta Therox
2020-12-07 21:59:26 +00:00
committed by GitHub
parent bfb259128b
commit 71e881a7ee
14 changed files with 23 additions and 441 deletions

2
src/lib/es5.d.ts vendored
View File

@@ -1376,7 +1376,7 @@ interface ArrayConstructor {
(arrayLength?: number): any[];
<T>(arrayLength: number): T[];
<T>(...items: T[]): T[];
isArray<T>(arg: T | {}): arg is T extends readonly any[] ? (unknown extends T ? never : readonly any[]) : any[];
isArray(arg: any): arg is any[];
readonly prototype: any[];
}

View File

@@ -1,100 +0,0 @@
//// [consistentUnionSubtypeReduction.ts]
// https://github.com/microsoft/TypeScript/issues/31155
declare const MyArray: {
isArray<T>(arg: T | {}): arg is T extends readonly any[] ? (unknown extends T ? never : readonly any[]) : any[];
};
declare const a: readonly string[] | string;
declare const b: string[] | string;
declare const c: unknown;
if (MyArray.isArray(a)) {
a; // readonly string[]
}
else {
a; // string
}
a; // readonly string[] | string;
if (MyArray.isArray(b)) {
b; // string[] | string;
}
else {
b; // string
}
b; // string[] | string;
if (MyArray.isArray(c)) {
c; // any[]
}
function f<T>(x: T) {
const a: readonly T[] | string = null!;
const b: T[] | string = null!;
const c: T = null!;
if (MyArray.isArray(a)) {
a; // readonly T[]
}
else {
a; // string
}
a; // readonly T[] | string;
if (MyArray.isArray(b)) {
b; // T[]
}
else {
b; // string
}
b;
if (MyArray.isArray(c)) {
c; // T & (T extends readonly any[] ? readonly any[] : any[])
}
}
//// [consistentUnionSubtypeReduction.js]
// https://github.com/microsoft/TypeScript/issues/31155
if (MyArray.isArray(a)) {
a; // readonly string[]
}
else {
a; // string
}
a; // readonly string[] | string;
if (MyArray.isArray(b)) {
b; // string[] | string;
}
else {
b; // string
}
b; // string[] | string;
if (MyArray.isArray(c)) {
c; // any[]
}
function f(x) {
var a = null;
var b = null;
var c = null;
if (MyArray.isArray(a)) {
a; // readonly T[]
}
else {
a; // string
}
a; // readonly T[] | string;
if (MyArray.isArray(b)) {
b; // T[]
}
else {
b; // string
}
b;
if (MyArray.isArray(c)) {
c; // T & (T extends readonly any[] ? readonly any[] : any[])
}
}

View File

@@ -1,130 +0,0 @@
=== tests/cases/compiler/consistentUnionSubtypeReduction.ts ===
// https://github.com/microsoft/TypeScript/issues/31155
declare const MyArray: {
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
isArray<T>(arg: T | {}): arg is T extends readonly any[] ? (unknown extends T ? never : readonly any[]) : any[];
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 3, 12))
>arg : Symbol(arg, Decl(consistentUnionSubtypeReduction.ts, 3, 15))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 3, 12))
>arg : Symbol(arg, Decl(consistentUnionSubtypeReduction.ts, 3, 15))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 3, 12))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 3, 12))
};
declare const a: readonly string[] | string;
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 6, 13))
declare const b: string[] | string;
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 7, 13))
declare const c: unknown;
>c : Symbol(c, Decl(consistentUnionSubtypeReduction.ts, 8, 13))
if (MyArray.isArray(a)) {
>MyArray.isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 6, 13))
a; // readonly string[]
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 6, 13))
}
else {
a; // string
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 6, 13))
}
a; // readonly string[] | string;
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 6, 13))
if (MyArray.isArray(b)) {
>MyArray.isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 7, 13))
b; // string[] | string;
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 7, 13))
}
else {
b; // string
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 7, 13))
}
b; // string[] | string;
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 7, 13))
if (MyArray.isArray(c)) {
>MyArray.isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>c : Symbol(c, Decl(consistentUnionSubtypeReduction.ts, 8, 13))
c; // any[]
>c : Symbol(c, Decl(consistentUnionSubtypeReduction.ts, 8, 13))
}
function f<T>(x: T) {
>f : Symbol(f, Decl(consistentUnionSubtypeReduction.ts, 28, 1))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 31, 11))
>x : Symbol(x, Decl(consistentUnionSubtypeReduction.ts, 31, 14))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 31, 11))
const a: readonly T[] | string = null!;
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 32, 9))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 31, 11))
const b: T[] | string = null!;
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 33, 9))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 31, 11))
const c: T = null!;
>c : Symbol(c, Decl(consistentUnionSubtypeReduction.ts, 34, 9))
>T : Symbol(T, Decl(consistentUnionSubtypeReduction.ts, 31, 11))
if (MyArray.isArray(a)) {
>MyArray.isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 32, 9))
a; // readonly T[]
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 32, 9))
}
else {
a; // string
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 32, 9))
}
a; // readonly T[] | string;
>a : Symbol(a, Decl(consistentUnionSubtypeReduction.ts, 32, 9))
if (MyArray.isArray(b)) {
>MyArray.isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 33, 9))
b; // T[]
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 33, 9))
}
else {
b; // string
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 33, 9))
}
b;
>b : Symbol(b, Decl(consistentUnionSubtypeReduction.ts, 33, 9))
if (MyArray.isArray(c)) {
>MyArray.isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>MyArray : Symbol(MyArray, Decl(consistentUnionSubtypeReduction.ts, 2, 13))
>isArray : Symbol(isArray, Decl(consistentUnionSubtypeReduction.ts, 2, 24))
>c : Symbol(c, Decl(consistentUnionSubtypeReduction.ts, 34, 9))
c; // T & (T extends readonly any[] ? readonly any[] : any[])
>c : Symbol(c, Decl(consistentUnionSubtypeReduction.ts, 34, 9))
}
}

View File

@@ -1,132 +0,0 @@
=== tests/cases/compiler/consistentUnionSubtypeReduction.ts ===
// https://github.com/microsoft/TypeScript/issues/31155
declare const MyArray: {
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
isArray<T>(arg: T | {}): arg is T extends readonly any[] ? (unknown extends T ? never : readonly any[]) : any[];
>isArray : <T>(arg: T | {}) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>arg : {} | T
};
declare const a: readonly string[] | string;
>a : string | readonly string[]
declare const b: string[] | string;
>b : string | string[]
declare const c: unknown;
>c : unknown
if (MyArray.isArray(a)) {
>MyArray.isArray(a) : boolean
>MyArray.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>a : string | readonly string[]
a; // readonly string[]
>a : readonly string[]
}
else {
a; // string
>a : string
}
a; // readonly string[] | string;
>a : string | readonly string[]
if (MyArray.isArray(b)) {
>MyArray.isArray(b) : boolean
>MyArray.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>b : string | string[]
b; // string[] | string;
>b : string[]
}
else {
b; // string
>b : string
}
b; // string[] | string;
>b : string | string[]
if (MyArray.isArray(c)) {
>MyArray.isArray(c) : boolean
>MyArray.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>c : unknown
c; // any[]
>c : any[]
}
function f<T>(x: T) {
>f : <T>(x: T) => void
>x : T
const a: readonly T[] | string = null!;
>a : string | readonly T[]
>null! : null
>null : null
const b: T[] | string = null!;
>b : string | T[]
>null! : null
>null : null
const c: T = null!;
>c : T
>null! : null
>null : null
if (MyArray.isArray(a)) {
>MyArray.isArray(a) : boolean
>MyArray.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>a : string | readonly T[]
a; // readonly T[]
>a : readonly T[]
}
else {
a; // string
>a : string
}
a; // readonly T[] | string;
>a : string | readonly T[]
if (MyArray.isArray(b)) {
>MyArray.isArray(b) : boolean
>MyArray.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>b : string | T[]
b; // T[]
>b : T[]
}
else {
b; // string
>b : string
}
b;
>b : string | T[]
if (MyArray.isArray(c)) {
>MyArray.isArray(c) : boolean
>MyArray.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>MyArray : { isArray<T>(arg: {} | T): arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]; }
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>c : T
c; // T & (T extends readonly any[] ? readonly any[] : any[])
>c : T & (T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[])
}
}

View File

@@ -67,9 +67,9 @@ export const updateIfChanged = <T>(t: T) => {
>assign : { <T, U>(target: T, source: U): T & U; <T, U, V>(target: T, source1: U, source2: V): T & U & V; <T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W; (target: object, ...sources: any[]): any; }
>Array.isArray(u) ? [] : {} : undefined[] | {}
>Array.isArray(u) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>u : U
>[] : undefined[]
>{} : {}

View File

@@ -1109,9 +1109,9 @@ define(function () {
>Array : ArrayConstructor
Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; };
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } : (value: any) => boolean
>value : any
>Object.prototype.toString.call(value) === '[object Array]' : boolean

View File

@@ -5,9 +5,9 @@ var maybeArray: number | number[];
if (Array.isArray(maybeArray)) {
>Array.isArray(maybeArray) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>maybeArray : number | number[]
maybeArray.length; // OK

View File

@@ -66,9 +66,9 @@ function f2() {
>a4 : string | false | (string | false)[]
>Array.isArray(elOrA) ? elOrA : [elOrA] : (string | false)[]
>Array.isArray(elOrA) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>elOrA : string | false | (string | false)[]
>elOrA : (string | false)[]
>[elOrA] : (string | false)[]
@@ -83,9 +83,9 @@ function f2() {
>...Array.isArray(elOrA) ? elOrA : [elOrA] : string | false
>Array.isArray(elOrA) ? elOrA : [elOrA] : (string | false)[]
>Array.isArray(elOrA) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>elOrA : string | false | (string | false)[]
>elOrA : (string | false)[]
>[elOrA] : (string | false)[]

View File

@@ -6,7 +6,7 @@
*/
var isArray = Array.isArray;
>isArray : Function
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]

View File

@@ -10,9 +10,9 @@ export function doRemove(dds: F | F[]) {
if (!Array.isArray(dds)) {
>!Array.isArray(dds) : boolean
>Array.isArray(dds) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>dds : F | F[]
dds = [dds]

View File

@@ -3068,13 +3068,13 @@ module Harness {
>(Array.isArray && Array.isArray(arg)) || arg instanceof Array : boolean
>(Array.isArray && Array.isArray(arg)) : boolean
>Array.isArray && Array.isArray(arg) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>Array.isArray(arg) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>arg : any
>arg instanceof Array : boolean
>arg : any

View File

@@ -77,9 +77,9 @@ function isShape(s : Shapes): s is Shape {
return !Array.isArray(s);
>!Array.isArray(s) : boolean
>Array.isArray(s) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>s : Shapes
}

View File

@@ -22,9 +22,9 @@ foo1 = [...Array.isArray(foo2) ? foo2 : [foo2]];
>...Array.isArray(foo2) ? foo2 : [foo2] : FooBase
>Array.isArray(foo2) ? foo2 : [foo2] : FooArray
>Array.isArray(foo2) : boolean
>Array.isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>Array.isArray : (arg: any) => arg is any[]
>Array : ArrayConstructor
>isArray : <T>(arg: {} | T) => arg is T extends readonly any[] ? unknown extends T ? never : readonly any[] : any[]
>isArray : (arg: any) => arg is any[]
>foo2 : Foo
>foo2 : FooArray
>[foo2] : FooBase[]

View File

@@ -1,56 +0,0 @@
// https://github.com/microsoft/TypeScript/issues/31155
declare const MyArray: {
isArray<T>(arg: T | {}): arg is T extends readonly any[] ? (unknown extends T ? never : readonly any[]) : any[];
};
declare const a: readonly string[] | string;
declare const b: string[] | string;
declare const c: unknown;
if (MyArray.isArray(a)) {
a; // readonly string[]
}
else {
a; // string
}
a; // readonly string[] | string;
if (MyArray.isArray(b)) {
b; // string[] | string;
}
else {
b; // string
}
b; // string[] | string;
if (MyArray.isArray(c)) {
c; // any[]
}
function f<T>(x: T) {
const a: readonly T[] | string = null!;
const b: T[] | string = null!;
const c: T = null!;
if (MyArray.isArray(a)) {
a; // readonly T[]
}
else {
a; // string
}
a; // readonly T[] | string;
if (MyArray.isArray(b)) {
b; // T[]
}
else {
b; // string
}
b;
if (MyArray.isArray(c)) {
c; // T & (T extends readonly any[] ? readonly any[] : any[])
}
}