2016-02-04 4 views
7

Как вы выполняете итерацию по набору в TypeScript? for..of не работает:Как перебирать набор в TypeScript?

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

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

ответ

15

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

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

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

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

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

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

Единственная вещь, которая работала была:

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

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

+4

Array.from? Массивы не работают – vinntec

2

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

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

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

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

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

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

Дополнительная информация на перебор Set с Еогеаспом можно найти here

+0

Я ценю быстрый ответ, но я нашел следующее, чтобы быть правдой: подход 1: «это» не сохраняется, и я думаю, что это, как правило, в том, что лямбда являются те, чтобы сохранить «этот» Подход 2: Это не компилируется для меня. Единственный способ, который я нашел, что работает так далеко от подхода «пока», был: для (var key of Array.from (this.keys.values ​​())) , и это далеко не желательно, поскольку Я думаю, что он создает новый массив, а Array.from не поддерживается полностью повсеместно. – user1019182

+0

Подлинный __, чтобы быть правдой? – SnareChops

1

Это работает для меня:

this.mySet.forEach((value: string, key: string) => { 
    console.log(key); 
    console.log(value); 
}); 

Я нашел его здесь: Other Stack Overflow question

0

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

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

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

Смежные вопросы