如何在TypeScript中迭代一组? for..of不起作用:
'Set<string>' is not an array type or a string type
.forEach
是不可接受的,因为它会隐藏this
。我不想在try catch块中执行while循环。我错过了什么?它可能是如此笨拙以至于需要尝试{while} catch {}。
答案 0 :(得分:24)
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())) {
}
或类似的东西,这太可怕了。
答案 1 :(得分: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()){
...
}
有关使用foreach迭代Set
的更多信息,请参见here
答案 2 :(得分:2)
扩展最受欢迎的答案,如果我们使用let
作为迭代变量,它也是类型安全的,所以:
for (let elem of setOfElems) {
... do anything with elem...
}
如果elem
被声明为setOfElems
,这将保证Set<X>
具有类型X.
答案 3 :(得分:1)
这对我有用:
this.mySet.forEach((value: string, key: string) => {
console.log(key);
console.log(value);
});
我在这里找到了它:Other Stack Overflow question
答案 4 :(得分:0)
如果在编译器选项中将for ... of
添加为"es6"
,并将"lib"
添加为目标,则可以在TypeScript中使用"es6"
。如果更适合您的需求,也可以在您的lib中使用"es2015.iterable"
代替"es6"
。
例如(这将是您的tsconfig.json):
{
"compilerOptions": {
"target": "es6",
"lib": [
"es6",
"dom"
]
},
"exclude": [
"node_modules"
]
}
有关GitHub的问题:https://github.com/Microsoft/TypeScript/issues/12707