如何在TypeScript中迭代Set?

时间:2016-02-04 05:51:47

标签: typescript

如何在TypeScript中迭代一组? for..of不起作用:

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

.forEach是不可接受的,因为它会隐藏this。我不想在try catch块中执行while循环。我错过了什么?它可能是如此笨拙以至于需要尝试{while} catch {}。

5 个答案:

答案 0 :(得分:24)

@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())) {
}

或类似的东西,这太可怕了。

答案 1 :(得分:2)

您仍然可以使用常规函数代替箭头函数将.forEachthis一起使用

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