Skip to content

Commit 50b61b8

Browse files
Array.isArray for readonly array
1 parent 9439e2f commit 50b61b8

40 files changed

+208
-178
lines changed

src/harness/fourslashInterfaceImpl.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,7 @@ namespace FourSlashInterface {
11731173
typeEntry("Record"),
11741174
typeEntry("Exclude"),
11751175
typeEntry("Extract"),
1176+
typeEntry("Cast"),
11761177
typeEntry("Omit"),
11771178
typeEntry("NonNullable"),
11781179
typeEntry("Parameters"),

src/lib/es2015.iterable.d.ts

+13
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ interface Array<T> {
5656
}
5757

5858
interface ArrayConstructor {
59+
/**
60+
* Determines whether an object is an array.
61+
* @param arg The object to test.
62+
*/
63+
isArray<T>(arg: T): arg is Cast<
64+
T extends readonly any[] ? T :
65+
T extends string ? never :
66+
T extends Iterable<infer U> | ArrayLike<infer U> ? U[] :
67+
unknown extends T ? any[] :
68+
never,
69+
T & {}
70+
>;
71+
5972
/**
6073
* Creates an array from an array-like or iterable object.
6174
* @param source An array-like or iterable object to convert to an array.

src/lib/es2017.object.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ interface ObjectConstructor {
2727
* Returns an object containing all own property descriptors of an object
2828
* @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
2929
*/
30-
getOwnPropertyDescriptors<T extends {}>(o: T): { [P in keyof T]: TypedPropertyDescriptor<T[P]> } & { [x: string]: PropertyDescriptor };
30+
getOwnPropertyDescriptors<T extends {}>(o: T): { [P in keyof T]: TypedPropertyDescriptor<T[P]> } & PropertyDescriptorMap;
3131
}

src/lib/es2019.object.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ interface ObjectConstructor {
55
* Returns an object created by key-value entries for properties and methods
66
* @param entries An iterable object that contains key-value entries for properties and methods.
77
*/
8-
fromEntries<T = any>(entries: Iterable<readonly [PropertyKey, T]>): { [k: string]: T };
8+
fromEntries<T = any>(entries: Iterable<readonly [PropertyKey, T]>): { [k: PropertyKey]: T };
99

1010
/**
1111
* Returns an object created by key-value entries for properties and methods

src/lib/es5.d.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -1495,7 +1495,18 @@ interface ArrayConstructor {
14951495
(arrayLength?: number): any[];
14961496
<T>(arrayLength: number): T[];
14971497
<T>(...items: T[]): T[];
1498-
isArray(arg: any): arg is any[];
1498+
/**
1499+
* Determines whether an object is an array.
1500+
* @param arg The object to test.
1501+
*/
1502+
isArray<T>(arg: T): arg is Cast<
1503+
T extends readonly any[] ? T :
1504+
T extends string ? never :
1505+
T extends ArrayLike<infer U> ? U[] :
1506+
unknown extends T ? any[] :
1507+
never,
1508+
T & {}
1509+
>;
14991510
readonly prototype: any[];
15001511
}
15011512

@@ -1615,6 +1626,11 @@ type Exclude<T, U> = T extends U ? never : T;
16151626
*/
16161627
type Extract<T, U> = T extends U ? T : never;
16171628

1629+
/**
1630+
* Make sure T is at least assignable to U
1631+
*/
1632+
type Cast<T, U> = T extends U ? T : U;
1633+
16181634
/**
16191635
* Construct a type with the properties of T except for those in type K.
16201636
*/

tests/baselines/reference/arrayDestructuringInSwitch1.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ export function evaluate(expression: Expression): boolean {
1111

1212
if (Array.isArray(expression)) {
1313
>Array.isArray(expression) : boolean
14-
>Array.isArray : (arg: any) => arg is any[]
14+
>Array.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
1515
>Array : ArrayConstructor
16-
>isArray : (arg: any) => arg is any[]
16+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
1717
>expression : Expression
1818

1919
const [operator, ...operands] = expression;

tests/baselines/reference/arrayTypeOfTypeOf.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ var xs2: typeof Array;
1414
>Array : ArrayConstructor
1515

1616
var xs3: typeof Array<number>;
17-
>xs3 : { (arrayLength: number): number[]; (...items: number[]): number[]; new (arrayLength: number): number[]; new (...items: number[]): number[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; }
17+
>xs3 : { (arrayLength: number): number[]; (...items: number[]): number[]; new (arrayLength: number): number[]; new (...items: number[]): number[]; isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
1818
>Array : ArrayConstructor
1919

2020
var xs4: typeof Array<typeof x>;
21-
>xs4 : { (arrayLength: number): number[]; (...items: number[]): number[]; new (arrayLength: number): number[]; new (...items: number[]): number[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; }
21+
>xs4 : { (arrayLength: number): number[]; (...items: number[]): number[]; new (arrayLength: number): number[]; new (...items: number[]): number[]; isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
2222
>Array : ArrayConstructor
2323
>x : number
2424

tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.symbols

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ export const updateIfChanged = <T>(t: T) => {
7979
>Object.assign : Symbol(ObjectConstructor.assign, Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --))
8080
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
8181
>assign : Symbol(ObjectConstructor.assign, Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --))
82-
>Array.isArray : Symbol(ArrayConstructor.isArray, Decl(lib.es5.d.ts, --, --))
82+
>Array.isArray : Symbol(ArrayConstructor.isArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
8383
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
84-
>isArray : Symbol(ArrayConstructor.isArray, Decl(lib.es5.d.ts, --, --))
84+
>isArray : Symbol(ArrayConstructor.isArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
8585
>u : Symbol(u, Decl(declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.ts, 7, 23))
8686
>u : Symbol(u, Decl(declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.ts, 7, 23))
8787
>[key] : Symbol([key], Decl(declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.ts, 12, 80))

tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ export const updateIfChanged = <T>(t: T) => {
6767
>assign : { <T extends {}>(target: T): T; <T extends {}, U>(target: T, source: U): T & Writable<U>; <T extends {}, U, V>(target: T, source1: U, source2: V): T & Writable<U> & Writable<V>; <T extends {}, U, V, W>(target: T, source1: U, source2: V, source3: W): T & Writable<U> & Writable<V> & Writable<W>; (target: {}, ...sources: any[]): any; }
6868
>Array.isArray(u) ? [] : {} : undefined[] | {}
6969
>Array.isArray(u) : boolean
70-
>Array.isArray : (arg: any) => arg is any[]
70+
>Array.isArray : { <T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; <T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends Iterable<infer U> | ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; }
7171
>Array : ArrayConstructor
72-
>isArray : (arg: any) => arg is any[]
72+
>isArray : { <T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; <T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends Iterable<infer U> | ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; }
7373
>u : U
7474
>[] : undefined[]
7575
>{} : {}

tests/baselines/reference/destructuringParameterDeclaration4.errors.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ tests/cases/conformance/es6/destructuring/destructuringParameterDeclaration4.ts(
4141
a1(...array2); // Error parameter type is (number|string)[]
4242
~~~~~~
4343
!!! error TS2552: Cannot find name 'array2'. Did you mean 'Array'?
44-
!!! related TS2728 /.ts/lib.es5.d.ts:1522:13: 'Array' is declared here.
44+
!!! related TS2728 /.ts/lib.es5.d.ts:1533:13: 'Array' is declared here.
4545
a5([1, 2, "string", false, true]); // Error, parameter type is [any, any, [[any]]]
4646
~~~~~~~~
4747
!!! error TS2322: Type 'string' is not assignable to type '[[any]]'.

tests/baselines/reference/fixSignatureCaching.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -1109,9 +1109,9 @@ define(function () {
11091109
>Array : ArrayConstructor
11101110

11111111
Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; };
1112-
>Array.isArray : (arg: any) => arg is any[]
1112+
>Array.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
11131113
>Array : ArrayConstructor
1114-
>isArray : (arg: any) => arg is any[]
1114+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
11151115
>function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } : (value: any) => boolean
11161116
>value : any
11171117
>Object.prototype.toString.call(value) === '[object Array]' : boolean
@@ -1150,9 +1150,9 @@ define(function () {
11501150
>'[object Array]' : "[object Array]"
11511151

11521152
: Array.isArray;
1153-
>Array.isArray : (arg: any) => arg is any[]
1153+
>Array.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
11541154
>Array : ArrayConstructor
1155-
>isArray : (arg: any) => arg is any[]
1155+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
11561156

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

tests/baselines/reference/instantiationExpressions.types

+6-6
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ function f2() {
6161
>Array : ArrayConstructor
6262

6363
const A1 = Array<string>; // new (...) => string[]
64-
>A1 : { (arrayLength: number): string[]; (...items: string[]): string[]; new (arrayLength: number): string[]; new (...items: string[]): string[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; }
65-
>Array<string> : { (arrayLength: number): string[]; (...items: string[]): string[]; new (arrayLength: number): string[]; new (...items: string[]): string[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; }
64+
>A1 : { (arrayLength: number): string[]; (...items: string[]): string[]; new (arrayLength: number): string[]; new (...items: string[]): string[]; isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
65+
>Array<string> : { (arrayLength: number): string[]; (...items: string[]): string[]; new (arrayLength: number): string[]; new (...items: string[]): string[]; isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
6666
>Array : ArrayConstructor
6767

6868
const A2 = Array<string, number>; // Error
69-
>A2 : { isArray(arg: any): arg is any[]; readonly prototype: any[]; }
70-
>Array<string, number> : { isArray(arg: any): arg is any[]; readonly prototype: any[]; }
69+
>A2 : { isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
70+
>Array<string, number> : { isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
7171
>Array : ArrayConstructor
7272
}
7373

@@ -76,11 +76,11 @@ type T20 = typeof Array<>; // Error
7676
>Array : ArrayConstructor
7777

7878
type T21 = typeof Array<string>; // new (...) => string[]
79-
>T21 : { (arrayLength: number): string[]; (...items: string[]): string[]; new (arrayLength: number): string[]; new (...items: string[]): string[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; }
79+
>T21 : { (arrayLength: number): string[]; (...items: string[]): string[]; new (arrayLength: number): string[]; new (...items: string[]): string[]; isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
8080
>Array : ArrayConstructor
8181

8282
type T22 = typeof Array<string, number>; // Error
83-
>T22 : { isArray(arg: any): arg is any[]; readonly prototype: any[]; }
83+
>T22 : { isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }
8484
>Array : ArrayConstructor
8585

8686
declare class C<T> {

tests/baselines/reference/isArray.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//// [isArray.ts]
2-
var maybeArray: number | number[];
2+
var maybeArray: number | number[] | readonly string[];
33

44

55
if (Array.isArray(maybeArray)) {

tests/baselines/reference/isArray.symbols

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
=== tests/cases/compiler/isArray.ts ===
2-
var maybeArray: number | number[];
2+
var maybeArray: number | number[] | readonly string[];
33
>maybeArray : Symbol(maybeArray, Decl(isArray.ts, 0, 3))
44

55

@@ -10,9 +10,9 @@ if (Array.isArray(maybeArray)) {
1010
>maybeArray : Symbol(maybeArray, Decl(isArray.ts, 0, 3))
1111

1212
maybeArray.length; // OK
13-
>maybeArray.length : Symbol(Array.length, Decl(lib.es5.d.ts, --, --))
13+
>maybeArray.length : Symbol(length, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
1414
>maybeArray : Symbol(maybeArray, Decl(isArray.ts, 0, 3))
15-
>length : Symbol(Array.length, Decl(lib.es5.d.ts, --, --))
15+
>length : Symbol(length, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
1616
}
1717
else {
1818
maybeArray.toFixed(); // OK

tests/baselines/reference/isArray.types

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
=== tests/cases/compiler/isArray.ts ===
2-
var maybeArray: number | number[];
3-
>maybeArray : number | number[]
2+
var maybeArray: number | number[] | readonly string[];
3+
>maybeArray : number | number[] | readonly string[]
44

55

66
if (Array.isArray(maybeArray)) {
77
>Array.isArray(maybeArray) : boolean
8-
>Array.isArray : (arg: any) => arg is any[]
8+
>Array.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
99
>Array : ArrayConstructor
10-
>isArray : (arg: any) => arg is any[]
11-
>maybeArray : number | number[]
10+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
11+
>maybeArray : number | number[] | readonly string[]
1212

1313
maybeArray.length; // OK
1414
>maybeArray.length : number
15-
>maybeArray : number[]
15+
>maybeArray : number[] | readonly string[]
1616
>length : number
1717
}
1818
else {

tests/baselines/reference/javascriptThisAssignmentInStaticBlock.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/src/a.js(10,7): error TS2417: Class static side 'typeof ElementsArray' incorrectly extends base class static side '{ isArray(arg: any): arg is any[]; readonly prototype: any[]; }'.
1+
/src/a.js(10,7): error TS2417: Class static side 'typeof ElementsArray' incorrectly extends base class static side '{ isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }'.
22
Types of property 'isArray' are incompatible.
3-
Type '(arg: any) => boolean' is not assignable to type '(arg: any) => arg is any[]'.
3+
Type '(arg: any) => boolean' is not assignable to type '<T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>'.
44
Signature '(arg: any): boolean' must be a type predicate.
55

66

@@ -16,9 +16,9 @@
1616
// GH#46468
1717
class ElementsArray extends Array {
1818
~~~~~~~~~~~~~
19-
!!! error TS2417: Class static side 'typeof ElementsArray' incorrectly extends base class static side '{ isArray(arg: any): arg is any[]; readonly prototype: any[]; }'.
19+
!!! error TS2417: Class static side 'typeof ElementsArray' incorrectly extends base class static side '{ isArray<T>(arg: T): arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>; readonly prototype: any[]; }'.
2020
!!! error TS2417: Types of property 'isArray' are incompatible.
21-
!!! error TS2417: Type '(arg: any) => boolean' is not assignable to type '(arg: any) => arg is any[]'.
21+
!!! error TS2417: Type '(arg: any) => boolean' is not assignable to type '<T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>'.
2222
!!! error TS2417: Signature '(arg: any): boolean' must be a type predicate.
2323
static {
2424
const superisArray = super.isArray;

tests/baselines/reference/javascriptThisAssignmentInStaticBlock.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,17 @@ class ElementsArray extends Array {
2525

2626
static {
2727
const superisArray = super.isArray;
28-
>superisArray : (arg: any) => arg is any[]
29-
>super.isArray : (arg: any) => arg is any[]
28+
>superisArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
29+
>super.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
3030
>super : ArrayConstructor
31-
>isArray : (arg: any) => arg is any[]
31+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
3232

3333
const customIsArray = (arg)=> superisArray(arg);
3434
>customIsArray : (arg: any) => boolean
3535
>(arg)=> superisArray(arg) : (arg: any) => boolean
3636
>arg : any
3737
>superisArray(arg) : boolean
38-
>superisArray : (arg: any) => arg is any[]
38+
>superisArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
3939
>arg : any
4040

4141
this.isArray = customIsArray;

tests/baselines/reference/literalFreshnessPropagationOnNarrowing.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ function f2() {
6666
>a4 : (string | false) | (string | false)[]
6767
>Array.isArray(elOrA) ? elOrA : [elOrA] : (string | false)[]
6868
>Array.isArray(elOrA) : boolean
69-
>Array.isArray : (arg: any) => arg is any[]
69+
>Array.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
7070
>Array : ArrayConstructor
71-
>isArray : (arg: any) => arg is any[]
71+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
7272
>elOrA : (string | false) | (string | false)[]
7373
>elOrA : (string | false)[]
7474
>[elOrA] : (string | false)[]
@@ -83,9 +83,9 @@ function f2() {
8383
>...Array.isArray(elOrA) ? elOrA : [elOrA] : string | false
8484
>Array.isArray(elOrA) ? elOrA : [elOrA] : (string | false)[]
8585
>Array.isArray(elOrA) : boolean
86-
>Array.isArray : (arg: any) => arg is any[]
86+
>Array.isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
8787
>Array : ArrayConstructor
88-
>isArray : (arg: any) => arg is any[]
88+
>isArray : <T>(arg: T) => arg is Cast<T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? any[] : never, T & {}>
8989
>elOrA : (string | false) | (string | false)[]
9090
>elOrA : (string | false)[]
9191
>[elOrA] : (string | false)[]

0 commit comments

Comments
 (0)