Closed
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
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
TReturn
type parameter forIterableIterator
andAsyncIterableIterator
types. - Current behavior is unsafe.
Playground Link:
Related Issues: