[英]How to iterate over a Set in TypeScript?
你如何在 TypeScript 中迭代一个集合? for..of 不起作用:
'Set<string>' is not an array type or a string type
.forEach
是不可接受的,因为它隐藏了this
。 我不想在 try catch 块中执行 while 循环。 我错过了什么? 它不可能笨到需要 try {while} catch {}。
@SnareChops 大部分是正确的:
mySet.forEach(function(item){
// do something with "this"
}, **this**);
这有效。
我正在猜测:
for(item of mySet.values()){
}
如果我不使用 es-shim 的东西会工作,这对我来说一切都搞砸了。 但是垫片的东西是由Angular 2的工作人员规定的所以¯_(ツ)_/¯
唯一有效的另一件事是:
for (var item of Array.from(set.values())) {
}
或类似的东西,这太可怕了。
您仍然可以通过使用常规函数而不是箭头函数将.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
更多信息
这对我有用:
this.mySet.forEach((value: string, key: string) => {
console.log(key);
console.log(value);
});
我在这里找到了: 其他堆栈溢出问题
扩展最受好评的答案,如果我们使用let
作为迭代变量,它也是类型安全的,所以:
for (let elem of setOfElems) {
... do anything with elem...
}
如果setOfElems
被声明为Set<X>
,这将保证elem
将具有 X 类型。
如果在编译器选项中将"es6"
添加为"lib"
,并将"es6"
为目标,则可以在 TypeScript 中使用for ... of
。 如果更适合您的需要,您也可以在库中使用"es2015.iterable"
代替"es6"
。
例如(这将是您的 tsconfig.json):
{
"compilerOptions": {
"target": "es6",
"lib": [
"es6",
"dom"
]
},
"exclude": [
"node_modules"
]
}
GitHub 上的相关问题: https : //github.com/Microsoft/TypeScript/issues/12707
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.