Skip to content

Commit f660c25

Browse files
lib Types and Documentations Fix
1 parent 8d7ad8c commit f660c25

29 files changed

+576
-70
lines changed

src/lib/es2015.iterable.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ interface Array<T> {
5656
}
5757

5858
interface ArrayConstructor {
59+
isArray<T>(arg: T): arg is
60+
T extends any ? Extract<
61+
true extends false & T ? any[] :
62+
T extends readonly any[] ? T :
63+
T extends string ? never :
64+
T extends ArrayLike<infer U> | Iterable<infer U> ? U[] :
65+
unknown[], T
66+
> : never;
67+
5968
/**
6069
* Creates an array from an iterable object.
6170
* @param iterable An iterable object to convert to an array.

src/lib/es5.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,14 @@ interface ArrayConstructor {
14631463
(arrayLength?: number): any[];
14641464
<T>(arrayLength: number): T[];
14651465
<T>(...items: T[]): T[];
1466-
isArray(arg: any): arg is any[];
1466+
isArray<T>(arg: T): arg is
1467+
T extends any ? Extract<
1468+
true extends false & T ? any[] :
1469+
T extends readonly any[] ? T :
1470+
T extends string ? never :
1471+
T extends ArrayLike<infer U> ? U[] :
1472+
unknown[], T
1473+
> : never;
14671474
readonly prototype: any[];
14681475
}
14691476

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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
1515
>Array : ArrayConstructor
16-
>isArray : (arg: any) => arg is any[]
16+
>isArray : <T>(arg: T) => arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; 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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; 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, --, --))
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, --, --))
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 {}, U>(target: T, source: U): T & U; <T extends {}, U, V>(target: T, source1: U, source2: V): T & U & V; <T extends {}, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W; (target: object, ...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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; <T>(arg: T): arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> | Iterable<infer U> ? U[] : unknown[], T> : never; }
7171
>Array : ArrayConstructor
72-
>isArray : (arg: any) => arg is any[]
72+
>isArray : { <T>(arg: T): arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; <T>(arg: T): arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> | Iterable<infer U> ? U[] : unknown[], T> : never; }
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:1490:13: 'Array' is declared here.
44+
!!! related TS2728 /.ts/lib.es5.d.ts:1497: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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
11131113
>Array : ArrayConstructor
1114-
>isArray : (arg: any) => arg is any[]
1114+
>isArray : <T>(arg: T) => arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
11541154
>Array : ArrayConstructor
1155-
>isArray : (arg: any) => arg is any[]
1155+
>isArray : <T>(arg: T) => arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; 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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; 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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; readonly prototype: any[]; }
70+
>Array<string, number> : { isArray<T>(arg: T): arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; 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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; 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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never; readonly prototype: any[]; }
8484
>Array : ArrayConstructor
8585

8686
declare class C<T> {

tests/baselines/reference/isArray.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ var maybeArray: number | number[];
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 T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
99
>Array : ArrayConstructor
10-
>isArray : (arg: any) => arg is any[]
10+
>isArray : <T>(arg: T) => arg is T extends any ? Extract<true extends false & T ? any[] : T extends readonly any[] ? T : T extends string ? never : T extends ArrayLike<infer U> ? U[] : unknown[], T> : never
1111
>maybeArray : number | number[]
1212

1313
maybeArray.length; // OK
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
//// [isArrayConformance.ts]
2+
function f1(a: any) {
3+
if (Array.isArray(a)) {
4+
a; // Expected: any[]
5+
}
6+
}
7+
8+
function f2(a: unknown) {
9+
if (Array.isArray(a)) {
10+
a; // Expected: unknown[]
11+
}
12+
}
13+
14+
function f3(a: string | readonly string[] | number[]) {
15+
if (Array.isArray(a)) {
16+
var b: readonly string[] | number[] = a; // OK
17+
a[0]; // Expected: string | number
18+
}
19+
}
20+
21+
function f4<T extends string | readonly string[] | number[]>(a: T) {
22+
if (Array.isArray(a)) {
23+
var b: readonly string[] | number[] = a; // OK
24+
a[0]; // Expected: string | number
25+
}
26+
}
27+
28+
// Repro from #41808
29+
30+
function f5<T extends string | undefined | string[]>(a: T) {
31+
if (Array.isArray(a)) {
32+
a[0]; // Expected: string
33+
}
34+
}
35+
36+
function f6(a: (number[] | null | "loading")[]) {
37+
a.filter(Array.isArray); // Expected: number[][]
38+
}
39+
40+
function f7(a: {} | null) {
41+
if (Array.isArray(a)) {
42+
a; // Expected: unknown[]
43+
}
44+
}
45+
46+
function f8<T extends ArrayLike<number> | Iterable<boolean> | readonly string[] | null>(a: T) {
47+
if (Array.isArray(a)) {
48+
var b: readonly string[] | number[] | boolean[] = a; // OK
49+
a[0]; // Expected: string | number | boolean
50+
}
51+
}
52+
53+
function f9(a: number | null) {
54+
if (Array.isArray(a)) {
55+
a; // Expected: never
56+
}
57+
}
58+
59+
60+
//// [isArrayConformance.js]
61+
function f1(a) {
62+
if (Array.isArray(a)) {
63+
a; // Expected: any[]
64+
}
65+
}
66+
function f2(a) {
67+
if (Array.isArray(a)) {
68+
a; // Expected: unknown[]
69+
}
70+
}
71+
function f3(a) {
72+
if (Array.isArray(a)) {
73+
var b = a; // OK
74+
a[0]; // Expected: string | number
75+
}
76+
}
77+
function f4(a) {
78+
if (Array.isArray(a)) {
79+
var b = a; // OK
80+
a[0]; // Expected: string | number
81+
}
82+
}
83+
// Repro from #41808
84+
function f5(a) {
85+
if (Array.isArray(a)) {
86+
a[0]; // Expected: string
87+
}
88+
}
89+
function f6(a) {
90+
a.filter(Array.isArray); // Expected: number[][]
91+
}
92+
function f7(a) {
93+
if (Array.isArray(a)) {
94+
a; // Expected: unknown[]
95+
}
96+
}
97+
function f8(a) {
98+
if (Array.isArray(a)) {
99+
var b = a; // OK
100+
a[0]; // Expected: string | number | boolean
101+
}
102+
}
103+
function f9(a) {
104+
if (Array.isArray(a)) {
105+
a; // Expected: never
106+
}
107+
}

0 commit comments

Comments
 (0)