Skip to content

Commit e1617b3

Browse files
committed
[RFC] Improve core types for (Async) Iterable/Iterator/Generator
* Changes `@@iterator` method to return more specific type in Generators. * An `$Iterator` is an `$Iterable` * Add optional `return` and `throw` methods to `$Iterator` (http://www.ecma-international.org/ecma-262/7.0/#table-54) * A `$Generator` is an `$Iterator` * Fix mistaken function name to `$asyncIterate` to match style of `$iterate`.
1 parent f35d3a9 commit e1617b3

File tree

18 files changed

+412
-406
lines changed

18 files changed

+412
-406
lines changed

lib/core.js

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ declare class Object {
6161

6262
// Well known Symbols.
6363
declare class $SymbolHasInstance mixins Symbol {}
64-
declare class $SymboIsConcatSpreadable mixins Symbol {}
64+
declare class $SymbolIsConcatSpreadable mixins Symbol {}
6565
declare class $SymbolIterator mixins Symbol {}
66+
declare class $SymbolAsyncIterator mixins Symbol {}
6667
declare class $SymbolMatch mixins Symbol {}
6768
declare class $SymbolReplace mixins Symbol {}
6869
declare class $SymbolSearch mixins Symbol {}
@@ -76,8 +77,9 @@ declare class Symbol {
7677
static (value?:any): Symbol;
7778
static for(key: string): Symbol;
7879
static hasInstance: $SymbolHasInstance;
79-
static isConcatSpreadable: $SymboIsConcatSpreadable;
80+
static isConcatSpreadable: $SymbolIsConcatSpreadable;
8081
static iterator: string; // polyfill '@@iterator'
82+
static asyncIterator: $SymbolAsyncIterator;
8183
static keyFor(sym: Symbol): ?string;
8284
static length: 0;
8385
static match: $SymbolMatch;
@@ -547,20 +549,22 @@ type IteratorResult<Yield,Return> =
547549
| { done: true, value?: Return }
548550
| { done: false, value: Yield };
549551

550-
interface $Iterator<+Yield,+Return,-Next> {
551-
@@iterator(): $Iterator<Yield,Return,Next>;
552-
next(value?: Next): IteratorResult<Yield,Return>;
553-
}
554-
type Iterator<+T> = $Iterator<T,void,void>;
555-
556552
interface $Iterable<+Yield,+Return,-Next> {
557553
@@iterator(): $Iterator<Yield,Return,Next>;
558554
}
559555
type Iterable<+T> = $Iterable<T,void,void>;
560556

561-
interface Generator<+Yield,+Return,-Next> {
557+
interface $Iterator<+Yield,+Return,-Next> extends $Iterable<Yield,Return,Next> {
562558
@@iterator(): $Iterator<Yield,Return,Next>;
563559
next(value?: Next): IteratorResult<Yield,Return>;
560+
+return?: <R>(value: R) => IteratorResult<Yield,R|Return>;
561+
+throw?: (error?: any) => IteratorResult<Yield,Return>;
562+
}
563+
type Iterator<+T> = $Iterator<T,void,void>;
564+
565+
interface Generator<+Yield,+Return,-Next> extends $Iterator<Yield,Return,Next> {
566+
@@iterator(): Generator<Yield,Return,Next>;
567+
next(value?: Next): IteratorResult<Yield,Return>;
564568
return<R>(value: R): IteratorResult<Yield,R|Return>;
565569
throw(error?: any): IteratorResult<Yield,Return>;
566570
}
@@ -569,25 +573,27 @@ declare function $iterate<T>(p: Iterable<T>): T;
569573

570574
/* Async Iterable/Iterator/Generator */
571575

572-
interface $AsyncIterator<+Yield,+Return,-Next> {
573-
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>;
574-
next(value?: Next): Promise<IteratorResult<Yield,Return>>;
575-
}
576-
type AsyncIterator<+T> = $AsyncIterator<T,void,void>;
577-
578576
interface $AsyncIterable<+Yield,+Return,-Next> {
579577
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>;
580578
}
581579
type AsyncIterable<+T> = $AsyncIterable<T,void,void>;
582580

583-
interface AsyncGenerator<+Yield,+Return,-Next> {
581+
interface $AsyncIterator<+Yield,+Return,-Next> extends $AsyncIterable<Yield,Return,Next> {
584582
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>;
585583
next(value?: Next): Promise<IteratorResult<Yield,Return>>;
584+
+return?: <R>(value: R) => Promise<IteratorResult<Yield,R|Return>>;
585+
+throw?: (error?: any) => Promise<IteratorResult<Yield,Return>>;
586+
}
587+
type AsyncIterator<+T> = $AsyncIterator<T,void,void>;
588+
589+
interface AsyncGenerator<+Yield,+Return,-Next> extends $AsyncIterator<Yield,Return,Next> {
590+
@@asyncIterator(): AsyncGenerator<Yield,Return,Next>;
591+
next(value?: Next): Promise<IteratorResult<Yield,Return>>;
586592
return<R>(value: R): Promise<IteratorResult<Yield,R|Return>>;
587593
throw(error?: any): Promise<IteratorResult<Yield,Return>>;
588594
}
589595

590-
declare function $asyncIterator<T>(p: AsyncIterable<T>): T;
596+
declare function $asyncIterate<T>(p: AsyncIterable<T>): T;
591597

592598
/* Maps and Sets */
593599

newtests/array_literal_tuple_spread/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,8 @@ export default suite(({addFile, addFiles, addCode}) => [
261261
test.js:3
262262
3: const arr: Array<number> = [..."hello"];
263263
^^^^^^ number. This type is incompatible with
264-
276: @@iterator(): Iterator<string>;
265-
^^^^^^ string. See lib: [LIB] core.js:276
264+
278: @@iterator(): Iterator<string>;
265+
^^^^^^ string. See lib: [LIB] core.js:278
266266
`,
267267
)
268268
.because('String is an Iterable<string>'),

0 commit comments

Comments
 (0)