diff --git a/src/lib/es2015.iterable.d.ts b/src/lib/es2015.iterable.d.ts index 07b7322dd1a12..66e8a6c3e9f86 100644 --- a/src/lib/es2015.iterable.d.ts +++ b/src/lib/es2015.iterable.d.ts @@ -76,21 +76,15 @@ interface Array { } interface ArrayConstructor { - /** - * Creates an array from an iterable object. - * @param iterable An iterable object to convert to an array. - */ - from(iterable: Iterable | ArrayLike): T[]; - - /** - * Creates an array from an iterable object. - * @param iterable An iterable object to convert to an array. - * @param mapfn A mapping function to call on every element of the array. - * @param thisArg Value of 'this' used to invoke the mapfn. - */ - from(iterable: Iterable | ArrayLike, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; + from>(iterable: T): T extends Iterable ? U[] : never; + from, U>( + iterable: T, + mapfn: (v: T extends Iterable ? V : never, k: number) => U, + thisArg?: any + ): U[]; } + interface ReadonlyArray { /** Iterator of values in the array. */ [Symbol.iterator](): ArrayIterator; diff --git a/tests/cases/conformance/types/array/fromUnionIterable.ts b/tests/cases/conformance/types/array/fromUnionIterable.ts new file mode 100644 index 0000000000000..6c51a50b1289e --- /dev/null +++ b/tests/cases/conformance/types/array/fromUnionIterable.ts @@ -0,0 +1,9 @@ +// @strict: true + +type Foo = Iterable | Iterable; +declare const foo: Foo; + +const result = Array.from(foo); + +type Expected = string[] | number[]; +const check: Expected = result;