How to iterate over a Set in TypeScript?

@SnareChops was mostly correct:

mySet.forEach(function(item){
    // do something with "this"
}, **this**);

This works.

I'm guessing:

for(item of mySet.values()){
}

Would work if I weren't working with es-shim stuff which is messing everything up for me. But the shim stuff is prescribed by the Angular 2 crew so ¯_(ツ)_/¯

The only other thing that worked was:

for (var item of Array.from(set.values())) {
}

or something like that, which is just terrible.


You can use for ... of in TypeScript if you add "es6" as "lib" in your compiler options, and "es6" as target. You may also use "es2015.iterable" in place of "es6" in your lib if that better suits your needs.

For example (this would be your tsconfig.json):

{
    "compilerOptions": {
        "target": "es6",
        "lib": [
            "es6",
            "dom"
        ]
    },
    "exclude": [
        "node_modules"
    ]
}

Related issue on GitHub: https://github.com/Microsoft/TypeScript/issues/12707


Extending the most upvoted answer, it is also type-safe if we use let for the iteration variable, so:

for (let elem of setOfElems) {
   ... do anything with elem...
}

This will guarantee that elem will have the type X, if setOfElems was declared as Set<X>.


You can still use .forEach with the correct this by using a regular function instead of an arrow function

mySet.forEach(function(item){
    expect(this).toEqual(item);
});

Compared to

class MyClass{
    ...
    doSomething():{
        mySet.forEach((item) => {
            expect(this instanceof MyClass).toEqual(true);
        });
    }
}

Another way to iterate is to use a for loop over the values

for(item of mySet.values()){
    ...
}

More information on iterating Set with foreach can be found here

Tags:

Typescript