Как перебрать набор в TypeScript?

Как вы перебираете набор из TypeScript? for..of не работает:

'Set<string>' is not an array type or a string type

.forEach неприемлемо, потому что он скрывает this. Я бы предпочел не делать цикл while в блоке catch try. Что мне не хватает? Возможно, это не так неуклюже, как требовать try {while} catch {}.

Ответ 1

@SnareChops был в основном правильным:

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

Это работает.

Я предполагаю:

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

Будет работать, если я не буду работать с файлами es-shim, которые все испортили для меня. Но прокладочный материал предписывается экипажем Angular 2, поэтому ¯_ (ツ) _/¯

Единственное, что сработало, было:

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

или что-то в этом роде, что просто ужасно.

Ответ 2

Вы все равно можете использовать .forEach с правильным this с помощью обычной функции вместо функции стрелки

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

По сравнению с

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

Другим способом повторения является использование цикла for над значениями

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

Более подробную информацию об итерации Set с помощью foreach можно найти здесь

Ответ 3

Расширяя самый высокий ответ, он также безопасен для типов, если мы используем let для переменной итерации, поэтому:

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

Это гарантирует, что elem будет иметь тип X, если setOfElems был объявлен как Set<X>.

Ответ 5

Вы можете использовать for... of в TypeScript, если вы добавите "es6" в качестве "lib" в опциях компилятора и "es6" в качестве цели.

Например (это будет ваш tsconfig.json):

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

Связанная проблема на GitHub: https://github.com/Microsoft/TypeScript/issues/12707