-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Closed
Labels
DuplicateAn existing issue was already createdAn existing issue was already created
Milestone
Description
TypeScript Version: 3.7.0-dev.20191010
Search Terms:
Iterable, AsyncIterable, Iterator, IteratorResult
Code
Synchronous iterators:
declare let syncIterable: Iterable<number>;
let res = syncIterable[Symbol.iterator]().next();
let value = res.value;Asynchronous iterator:
declare let asyncIterable: AsyncIterable<number>;
(async () => {
let res = await asyncIterable[Symbol.asyncIterator]().next();
let value = res.value;
});Expected behavior:
In both cases value has number type.
Actual behavior:
Variable value has any type.
Investigation
Type IteratorResult has two type parameters T and TReturn:
TypeScript/lib/lib.es2015.iterable.d.ts
Line 41 in 6162001
| type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>; |
Because by default TReturn is any (interface Iterable has only one type parameter), we got number | any type, which is narrowed to any.
There are two problems:
- There is no way to specify
TReturntype parameter forIterableIteratorandAsyncIterableIteratortypes. - Current behavior is unsafe.
Playground Link:
Related Issues:
brainkim, bterlson and xirzecbrainkim
Metadata
Metadata
Assignees
Labels
DuplicateAn existing issue was already createdAn existing issue was already created