Skip to content

Commit c188864

Browse files
Merge pull request #26112 from rhys-vdw/22685-array-flat-fix
Fix issue with Array#flatMap callback return type
2 parents d265fbf + 23640d9 commit c188864

File tree

5 files changed

+65
-2
lines changed

5 files changed

+65
-2
lines changed

src/lib/esnext.array.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ interface ReadonlyArray<T> {
1111
* thisArg is omitted, undefined is used as the this value.
1212
*/
1313
flatMap<U, This = undefined> (
14-
callback: (this: This, value: T, index: number, array: T[]) => U|U[],
14+
callback: (this: This, value: T, index: number, array: T[]) => U|ReadonlyArray<U>,
1515
thisArg?: This
1616
): U[]
1717

@@ -125,7 +125,7 @@ interface Array<T> {
125125
* thisArg is omitted, undefined is used as the this value.
126126
*/
127127
flatMap<U, This = undefined> (
128-
callback: (this: This, value: T, index: number, array: T[]) => U|U[],
128+
callback: (this: This, value: T, index: number, array: T[]) => U|ReadonlyArray<U>,
129129
thisArg?: This
130130
): U[]
131131

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [arrayFlatMap.ts]
2+
const array: number[] = [];
3+
const readonlyArray: ReadonlyArray<number> = [];
4+
array.flatMap((): ReadonlyArray<number> => []); // ok
5+
readonlyArray.flatMap((): ReadonlyArray<number> => []); // ok
6+
7+
8+
//// [arrayFlatMap.js]
9+
var array = [];
10+
var readonlyArray = [];
11+
array.flatMap(function () { return []; }); // ok
12+
readonlyArray.flatMap(function () { return []; }); // ok
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/compiler/arrayFlatMap.ts ===
2+
const array: number[] = [];
3+
>array : Symbol(array, Decl(arrayFlatMap.ts, 0, 5))
4+
5+
const readonlyArray: ReadonlyArray<number> = [];
6+
>readonlyArray : Symbol(readonlyArray, Decl(arrayFlatMap.ts, 1, 5))
7+
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2016.array.include.d.ts, --, --), Decl(lib.esnext.array.d.ts, --, --))
8+
9+
array.flatMap((): ReadonlyArray<number> => []); // ok
10+
>array.flatMap : Symbol(Array.flatMap, Decl(lib.esnext.array.d.ts, --, --))
11+
>array : Symbol(array, Decl(arrayFlatMap.ts, 0, 5))
12+
>flatMap : Symbol(Array.flatMap, Decl(lib.esnext.array.d.ts, --, --))
13+
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2016.array.include.d.ts, --, --), Decl(lib.esnext.array.d.ts, --, --))
14+
15+
readonlyArray.flatMap((): ReadonlyArray<number> => []); // ok
16+
>readonlyArray.flatMap : Symbol(ReadonlyArray.flatMap, Decl(lib.esnext.array.d.ts, --, --))
17+
>readonlyArray : Symbol(readonlyArray, Decl(arrayFlatMap.ts, 1, 5))
18+
>flatMap : Symbol(ReadonlyArray.flatMap, Decl(lib.esnext.array.d.ts, --, --))
19+
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2016.array.include.d.ts, --, --), Decl(lib.esnext.array.d.ts, --, --))
20+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/compiler/arrayFlatMap.ts ===
2+
const array: number[] = [];
3+
>array : number[]
4+
>[] : undefined[]
5+
6+
const readonlyArray: ReadonlyArray<number> = [];
7+
>readonlyArray : ReadonlyArray<number>
8+
>[] : undefined[]
9+
10+
array.flatMap((): ReadonlyArray<number> => []); // ok
11+
>array.flatMap((): ReadonlyArray<number> => []) : number[]
12+
>array.flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | ReadonlyArray<U>, thisArg?: This) => U[]
13+
>array : number[]
14+
>flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | ReadonlyArray<U>, thisArg?: This) => U[]
15+
>(): ReadonlyArray<number> => [] : () => ReadonlyArray<number>
16+
>[] : undefined[]
17+
18+
readonlyArray.flatMap((): ReadonlyArray<number> => []); // ok
19+
>readonlyArray.flatMap((): ReadonlyArray<number> => []) : number[]
20+
>readonlyArray.flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | ReadonlyArray<U>, thisArg?: This) => U[]
21+
>readonlyArray : ReadonlyArray<number>
22+
>flatMap : <U, This = undefined>(callback: (this: This, value: number, index: number, array: number[]) => U | ReadonlyArray<U>, thisArg?: This) => U[]
23+
>(): ReadonlyArray<number> => [] : () => ReadonlyArray<number>
24+
>[] : undefined[]
25+

tests/cases/compiler/arrayFlatMap.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @lib: esnext
2+
3+
const array: number[] = [];
4+
const readonlyArray: ReadonlyArray<number> = [];
5+
array.flatMap((): ReadonlyArray<number> => []); // ok
6+
readonlyArray.flatMap((): ReadonlyArray<number> => []); // ok

0 commit comments

Comments
 (0)