Add tests for iterator spread in call

This commit is contained in:
Jason Freeman 2015-03-24 16:52:00 -07:00
parent 376574d1be
commit 4a0af76064
36 changed files with 1310 additions and 0 deletions

View file

@ -0,0 +1,21 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall.ts (1 errors) ====
foo(...new SymbolIterator);
~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
function foo(s: symbol) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//// [iteratorSpreadInCall.ts]
foo(...new SymbolIterator);
function foo(s: symbol) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall.js]
foo(...new SymbolIterator);
function foo(s) {
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,22 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall10.ts (1 errors) ====
foo(...new SymbolIterator);
~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
function foo<T>(s: T[]) { return s[0] }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,34 @@
//// [iteratorSpreadInCall10.ts]
foo(...new SymbolIterator);
function foo<T>(s: T[]) { return s[0] }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall10.js]
foo(...new SymbolIterator);
function foo(s) {
return s[0];
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,34 @@
//// [iteratorSpreadInCall11.ts]
foo(...new SymbolIterator);
function foo<T>(...s: T[]) { return s[0] }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall11.js]
foo(...new SymbolIterator);
function foo(...s) {
return s[0];
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,45 @@
=== tests/cases/conformance/es6/spread/iteratorSpreadInCall11.ts ===
foo(...new SymbolIterator);
>foo(...new SymbolIterator) : symbol
>foo : <T>(...s: T[]) => T
>...new SymbolIterator : symbol
>new SymbolIterator : SymbolIterator
>SymbolIterator : typeof SymbolIterator
function foo<T>(...s: T[]) { return s[0] }
>foo : <T>(...s: T[]) => T
>T : T
>s : T[]
>T : T
>s[0] : T
>s : T[]
class SymbolIterator {
>SymbolIterator : SymbolIterator
next() {
>next : () => { value: symbol; done: boolean; }
return {
>{ value: Symbol(), done: false } : { value: symbol; done: boolean; }
value: Symbol(),
>value : symbol
>Symbol() : symbol
>Symbol : SymbolConstructor
done: false
>done : boolean
};
}
[Symbol.iterator]() {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
return this;
>this : SymbolIterator
}
}

View file

@ -0,0 +1,66 @@
//// [iteratorSpreadInCall12.ts]
new Foo(...[...new SymbolIterator, ...[...new StringIterator]]);
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall12.js]
new Foo(...[
...new SymbolIterator,
...[
...new StringIterator
]
]);
class Foo {
constructor(...s) {
}
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,81 @@
=== tests/cases/conformance/es6/spread/iteratorSpreadInCall12.ts ===
new Foo(...[...new SymbolIterator, ...[...new StringIterator]]);
>new Foo(...[...new SymbolIterator, ...[...new StringIterator]]) : Foo<string | symbol>
>Foo : typeof Foo
>...[...new SymbolIterator, ...[...new StringIterator]] : string | symbol
>[...new SymbolIterator, ...[...new StringIterator]] : (string | symbol)[]
>...new SymbolIterator : symbol
>new SymbolIterator : SymbolIterator
>SymbolIterator : typeof SymbolIterator
>...[...new StringIterator] : string
>[...new StringIterator] : string[]
>...new StringIterator : string
>new StringIterator : StringIterator
>StringIterator : typeof StringIterator
class Foo<T> {
>Foo : Foo<T>
>T : T
constructor(...s: T[]) { }
>s : T[]
>T : T
}
class SymbolIterator {
>SymbolIterator : SymbolIterator
next() {
>next : () => { value: symbol; done: boolean; }
return {
>{ value: Symbol(), done: false } : { value: symbol; done: boolean; }
value: Symbol(),
>value : symbol
>Symbol() : symbol
>Symbol : SymbolConstructor
done: false
>done : boolean
};
}
[Symbol.iterator]() {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
return this;
>this : SymbolIterator
}
}
class StringIterator {
>StringIterator : StringIterator
next() {
>next : () => { value: string; done: boolean; }
return {
>{ value: "", done: false } : { value: string; done: boolean; }
value: "",
>value : string
done: false
>done : boolean
};
}
[Symbol.iterator]() {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
return this;
>this : StringIterator
}
}

View file

@ -0,0 +1,21 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall2.ts (1 errors) ====
foo(...new SymbolIterator);
~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
function foo(s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//// [iteratorSpreadInCall2.ts]
foo(...new SymbolIterator);
function foo(s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall2.js]
foo(...new SymbolIterator);
function foo(s) {
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//// [iteratorSpreadInCall3.ts]
foo(...new SymbolIterator);
function foo(...s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall3.js]
foo(...new SymbolIterator);
function foo(...s) {
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,41 @@
=== tests/cases/conformance/es6/spread/iteratorSpreadInCall3.ts ===
foo(...new SymbolIterator);
>foo(...new SymbolIterator) : void
>foo : (...s: symbol[]) => void
>...new SymbolIterator : symbol
>new SymbolIterator : SymbolIterator
>SymbolIterator : typeof SymbolIterator
function foo(...s: symbol[]) { }
>foo : (...s: symbol[]) => void
>s : symbol[]
class SymbolIterator {
>SymbolIterator : SymbolIterator
next() {
>next : () => { value: symbol; done: boolean; }
return {
>{ value: Symbol(), done: false } : { value: symbol; done: boolean; }
value: Symbol(),
>value : symbol
>Symbol() : symbol
>Symbol : SymbolConstructor
done: false
>done : boolean
};
}
[Symbol.iterator]() {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
return this;
>this : SymbolIterator
}
}

View file

@ -0,0 +1,21 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts(1,1): error TS2346: Supplied parameters do not match any signature of call target.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall4.ts (1 errors) ====
foo(...new SymbolIterator);
~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
function foo(s1: symbol, ...s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//// [iteratorSpreadInCall4.ts]
foo(...new SymbolIterator);
function foo(s1: symbol, ...s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall4.js]
foo(...new SymbolIterator);
function foo(s1, ...s) {
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,56 @@
//// [iteratorSpreadInCall5.ts]
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s: (symbol | string)[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall5.js]
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s) {
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,72 @@
=== tests/cases/conformance/es6/spread/iteratorSpreadInCall5.ts ===
foo(...new SymbolIterator, ...new StringIterator);
>foo(...new SymbolIterator, ...new StringIterator) : void
>foo : (...s: (string | symbol)[]) => void
>...new SymbolIterator : symbol
>new SymbolIterator : SymbolIterator
>SymbolIterator : typeof SymbolIterator
>...new StringIterator : string
>new StringIterator : StringIterator
>StringIterator : typeof StringIterator
function foo(...s: (symbol | string)[]) { }
>foo : (...s: (string | symbol)[]) => void
>s : (string | symbol)[]
class SymbolIterator {
>SymbolIterator : SymbolIterator
next() {
>next : () => { value: symbol; done: boolean; }
return {
>{ value: Symbol(), done: false } : { value: symbol; done: boolean; }
value: Symbol(),
>value : symbol
>Symbol() : symbol
>Symbol : SymbolConstructor
done: false
>done : boolean
};
}
[Symbol.iterator]() {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
return this;
>this : SymbolIterator
}
}
class StringIterator {
>StringIterator : StringIterator
next() {
>next : () => { value: string; done: boolean; }
return {
>{ value: "", done: false } : { value: string; done: boolean; }
value: "",
>value : string
done: false
>done : boolean
};
}
[Symbol.iterator]() {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
return this;
>this : StringIterator
}
}

View file

@ -0,0 +1,36 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts(1,28): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number | symbol'.
Type 'string' is not assignable to type 'symbol'.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall6.ts (1 errors) ====
foo(...new SymbolIterator, ...new StringIterator);
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number | symbol'.
!!! error TS2345: Type 'string' is not assignable to type 'symbol'.
function foo(...s: (symbol | number)[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,56 @@
//// [iteratorSpreadInCall6.ts]
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s: (symbol | number)[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall6.js]
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s) {
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,36 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts(1,1): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall7.ts (1 errors) ====
foo(...new SymbolIterator, ...new StringIterator);
~~~
!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
!!! error TS2453: Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'.
function foo<T>(...s: T[]) { return s[0]; }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,57 @@
//// [iteratorSpreadInCall7.ts]
foo(...new SymbolIterator, ...new StringIterator);
function foo<T>(...s: T[]) { return s[0]; }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall7.js]
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s) {
return s[0];
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,39 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts(1,5): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall8.ts (1 errors) ====
new Foo(...new SymbolIterator, ...new StringIterator);
~~~
!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
!!! error TS2453: Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'.
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,61 @@
//// [iteratorSpreadInCall8.ts]
new Foo(...new SymbolIterator, ...new StringIterator);
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall8.js]
new Foo(...new SymbolIterator, ...new StringIterator);
class Foo {
constructor(...s) {
}
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,39 @@
tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts(1,5): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'.
==== tests/cases/conformance/es6/spread/iteratorSpreadInCall9.ts (1 errors) ====
new Foo(...new SymbolIterator, ...[...new StringIterator]);
~~~
!!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly.
!!! error TS2453: Type argument candidate 'symbol' is not a valid type argument because it is not a supertype of candidate 'string'.
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,63 @@
//// [iteratorSpreadInCall9.ts]
new Foo(...new SymbolIterator, ...[...new StringIterator]);
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
//// [iteratorSpreadInCall9.js]
new Foo(...new SymbolIterator, ...[
...new StringIterator
]);
class Foo {
constructor(...s) {
}
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,16 @@
//@target: ES6
foo(...new SymbolIterator);
function foo(s: symbol) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,17 @@
//@target: ES6
foo(...new SymbolIterator);
function foo<T>(s: T[]) { return s[0] }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,17 @@
//@target: ES6
foo(...new SymbolIterator);
function foo<T>(...s: T[]) { return s[0] }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//@target: ES6
new Foo(...[...new SymbolIterator, ...[...new StringIterator]]);
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,16 @@
//@target: ES6
foo(...new SymbolIterator);
function foo(s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,16 @@
//@target: ES6
foo(...new SymbolIterator);
function foo(...s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,16 @@
//@target: ES6
foo(...new SymbolIterator);
function foo(s1: symbol, ...s: symbol[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,29 @@
//@target: ES6
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s: (symbol | string)[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,29 @@
//@target: ES6
foo(...new SymbolIterator, ...new StringIterator);
function foo(...s: (symbol | number)[]) { }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,29 @@
//@target: ES6
foo(...new SymbolIterator, ...new StringIterator);
function foo<T>(...s: T[]) { return s[0]; }
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//@target: ES6
new Foo(...new SymbolIterator, ...new StringIterator);
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}

View file

@ -0,0 +1,32 @@
//@target: ES6
new Foo(...new SymbolIterator, ...[...new StringIterator]);
class Foo<T> {
constructor(...s: T[]) { }
}
class SymbolIterator {
next() {
return {
value: Symbol(),
done: false
};
}
[Symbol.iterator]() {
return this;
}
}
class StringIterator {
next() {
return {
value: "",
done: false
};
}
[Symbol.iterator]() {
return this;
}
}