使用新 Set 在数组中去除重复项会产生错误。

3

我正在尝试使用new Set来移除数组中的重复项,但是出现了错误“new Set(names).slice is not a function”

const names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
const uniq = [ ...new Set(names) ];
console.log(uniq);

这里是在stackblitz上的代码


2
使用 Array.from(new Set(names)) - 这样更易读 :-) - Bergi
是的,你说得对。 - anonymous
2个回答

5

我通过在项目根目录添加一个tsconfig.json成功解决了错误。这是一个非常简单的配置:

{
  "compilerOptions": {
    "target": "es6"
  }
}

发生的情况是TypeScript编译成了JavaScript的es3版本,如果没有配置目标,则默认为此版本,具体请参见此处(请参阅--target)。

2
当您的代码通过构建阶段并从TypeScript翻译为JavaScript时,您发布的第二行代码将变成:
var uniq = new Set(names).slice();

就我个人而言,我认为这是TypeScript的一个bug,但我从未使用过TypeScript,所以不能确定。

编辑 - 实际上,我认为只有在目标为ES5时才会发生这种情况。


看起来这是一种“优化”,其中展开语法仅支持数组,而不支持任意可迭代对象。 - Bergi
1
@Bergi 对,如果 TypeScript 的目标是 ES6,它可能会有不同的工作方式;我对此不了解太多,并且在链接的 Angular 设置中找不到明显影响 TypeScript 构建步骤的内容。 - Pointy
关于这个行为,至少有一个未解决的问题:https://github.com/Microsoft/TypeScript/issues/8856 - Andreas
@Pointy,您的答案非常有帮助。 - anonymous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接