Javascript 在typescript中使用扩展语法和new Set()

Javascript 在typescript中使用扩展语法和new Set(),javascript,typescript,ecmascript-6,spread-syntax,Javascript,Typescript,Ecmascript 6,Spread Syntax,我正在使用以下代码获取唯一编号: let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3] 但是,typescript报告以下错误:类型“Set”不是数组类型。 我不是typescript忍者,有人能告诉我这里出了什么问题吗?更新:使用typescript 2.3,您现在可以将“downlevelIteration”:true添加到您的tsconfig中,这将在针对ES5时起作用 downleveryiteration的缺点是,TS

我正在使用以下代码获取唯一编号:

let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
但是,typescript报告以下错误:类型“Set”不是数组类型。
我不是typescript忍者,有人能告诉我这里出了什么问题吗?

更新:使用typescript 2.3,您现在可以将
“downlevelIteration”:true
添加到您的tsconfig中,这将在针对ES5时起作用

downleveryiteration
的缺点是,TS在传输时必须注入相当多的样板文件。问题中的一行包含21行添加的样板文件:(从Typescript 2.6.1开始)

var uu read=(this&&this.u read)|函数(o,n){
var m=typeof Symbol==“函数”&&o[Symbol.iterator];
如果(!m)返回o;
var i=m.call(o),r,ar=[],e;
试一试{
而((n==void 0 | | n-->0)和&!(r=i.next().done)ar.push(r.value);
}
捕获(错误){e={error:error};}
最后{
试一试{
如果(r&&!r.done&(m=i[“return”])m.call(i);
}
最后{if(e)抛出e.error;}
}
返回ar;
};
var uu-spread=(this&&this.u-spread)|函数(){
对于(var ar=[],i=0;i控制台日志(uniques)这是缺少的功能。TypeScript目前只支持数组上的iterables。

您需要在tsconfig中设置
“target:”es6“,

您还可以使用Array.from方法将集合转换为数组

let uniques=Array.from(新集合([1,2,3,1,1]);

控制台日志(uniques)要使其工作,您需要“目标”:“ES6”(或更高版本)或“downlevelIteration”:在tsconfig.json的编译器选项中为true。 这解决了我的问题,对我来说效果很好。希望它也能对您有所帮助。

在Javascript中:

[ ...new Set([1, 2, 3, 1, 1]) ]
在Typescript中:

Array.from(new Set([1, 2, 3, 1, 1]))
处于反应状态(设置状态):


现在,您可以在Typescript设置中使用
Set
(无需针对
es6
):

在您的
tsconfig.json
中,添加以下行:

{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */

    
    "downlevelIteration": true,                  /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    
  },
  ...
}

我认为这只是一个Typescript错误,如果您使用的版本声称支持ES2015。@非常抱歉,我应该包括tsc的版本,它是1.6.2版本,以便澄清。我将使用.filter()或其他方法来完成这项工作。我在github上也发现了一些关于这个特定错误的问题。我会在以后的版本中关注这一点。@Restam:typescript是否为Array.from IE中的“target”:“es5”在tsconfig.json中提供多填充?@jackOfAll不,typescript不会为您提供任何原型的多填充。如果设置“target”:“es5”,如果您试图使用需要多填充的方法,则会出现编译器错误。@Restam使用
Array.from
重新启动伟大的解决方案。大多数其他人似乎只是放弃了这一点。谢谢你提供了一个真正的解决方案!这不是一个bug,他们只是不支持
es5
目标(请参阅)<代码>数组。如果Tconfig中的
lib
列表中有
es2015
或更高版本(
es2017
esnext
),则可以使用from
。@SimonHänisch感谢链接:我已经更新了我的答案,我不再称之为“bug”,而是“transpilation quirk”,这可能是一个更准确的术语。我还从该链接中添加了关于下层迭代选项的信息,这也解决了最初的问题。仅在新阵列中重新捕获阵列有什么意义?如果不可能在tsconfig中以“es6”为目标。如果需要使用Set with spread运算符,您将如何操作?关键是,如果使用
Array.from()
,则不再需要spread运算符。这只会增加开销
let uniques=Array.from(新集合([1,2,3,1,1])
{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */

    
    "downlevelIteration": true,                  /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    
  },
  ...
}