Skip to content

Commit d158cbb

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

38 files changed

+173
-141
lines changed

src/harness/fourslashInterfaceImpl.ts

Lines changed: 1 addition & 0 deletions
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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,20 @@ 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+
0 extends (1 & T) ? any[] :
65+
T extends readonly unknown[] ? T :
66+
T extends string ? never :
67+
T extends Iterable<infer U> | ArrayLike<infer U> ? U[] :
68+
unknown extends T ? unknown[] :
69+
never,
70+
T
71+
>;
72+
5973
/**
6074
* Creates an array from an array-like or iterable object.
6175
* @param source An array-like or iterable object to convert to an array.

src/lib/es2017.object.d.ts

Lines changed: 1 addition & 1 deletion
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/es5.d.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1495,7 +1495,19 @@ 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+
0 extends (1 & T) ? any[] :
1504+
T extends readonly unknown[] ? T :
1505+
T extends string ? never :
1506+
T extends ArrayLike<infer U> ? U[] :
1507+
unknown extends T ? unknown[] :
1508+
never,
1509+
T
1510+
>;
14991511
readonly prototype: any[];
15001512
}
15011513

@@ -1615,6 +1627,11 @@ type Exclude<T, U> = T extends U ? never : T;
16151627
*/
16161628
type Extract<T, U> = T extends U ? T : never;
16171629

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

tests/baselines/reference/arrayDestructuringInSwitch1.types

Lines changed: 2 additions & 2 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
1515
>Array : ArrayConstructor
16-
>isArray : (arg: any) => arg is any[]
16+
>isArray : <T>(arg: T) => arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
1717
>expression : Expression
1818

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

tests/baselines/reference/arrayTypeOfTypeOf.types

Lines changed: 2 additions & 2 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; readonly prototype: any[]; }
2222
>Array : ArrayConstructor
2323
>x : number
2424

tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.symbols

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; <T>(arg: T): arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends Iterable<infer U> | ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; }
7171
>Array : ArrayConstructor
72-
>isArray : (arg: any) => arg is any[]
72+
>isArray : { <T>(arg: T): arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; <T>(arg: T): arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends Iterable<infer U> | ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; }
7373
>u : U
7474
>[] : undefined[]
7575
>{} : {}

tests/baselines/reference/destructuringParameterDeclaration4.errors.txt

Lines changed: 1 addition & 1 deletion
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:1534: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

Lines changed: 4 additions & 4 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
11131113
>Array : ArrayConstructor
1114-
>isArray : (arg: any) => arg is any[]
1114+
>isArray : <T>(arg: T) => arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
11541154
>Array : ArrayConstructor
1155-
>isArray : (arg: any) => arg is any[]
1155+
>isArray : <T>(arg: T) => arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
11561156

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

tests/baselines/reference/instantiationExpressions.types

Lines changed: 6 additions & 6 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; readonly prototype: any[]; }
70+
>Array<string, number> : { isArray<T>(arg: T): arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>; readonly prototype: any[]; }
8484
>Array : ArrayConstructor
8585

8686
declare class C<T> {

tests/baselines/reference/isArray.js

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 6 additions & 6 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
99
>Array : ArrayConstructor
10-
>isArray : (arg: any) => arg is any[]
11-
>maybeArray : number | number[]
10+
>isArray : <T>(arg: T) => arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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

Lines changed: 4 additions & 4 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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

Lines changed: 4 additions & 4 deletions
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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
29+
>super.isArray : <T>(arg: T) => arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
3030
>super : ArrayConstructor
31-
>isArray : (arg: any) => arg is any[]
31+
>isArray : <T>(arg: T) => arg is Cast<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : 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<0 extends 1 & T ? any[] : T extends readonly unknown[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown extends T ? unknown[] : never, T>
3939
>arg : any
4040

4141
this.isArray = customIsArray;

0 commit comments

Comments
 (0)