繁体   English   中英

如何迭代 TypeScript 中的 Set?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM