Aggiornamento : con Typescript 2.3, ora puoi aggiungere "downlevelIteration": trueal tuo tsconfig, e questo funzionerà mentre prendi di mira ES5.
Lo svantaggio di downlevelIterationè che TS dovrà iniettare un bel po 'di boilerplate durante il transpiling. La singola riga della domanda si trasporta con 21 righe di boilerplate aggiunto: (come da Typescript 2.6.1)
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
var uniques = __spread(new Set([1, 2, 3, 1, 1]));
console.log(uniques);
Questo boilerplate verrà iniettato una volta per file che utilizza l'iterazione di livello inferiore e questo boilerplate può essere ridotto utilizzando l' "importHelpers"opzione tramite tsconfig. (Vedi questo post del blog sull'iterazione di livello inferiore e importHelpers)
In alternativa, se il supporto ES5 non è importante per te, puoi sempre scegliere come target "es6" in primo luogo, nel qual caso il codice originale funziona senza bisogno del flag "downlevelIteration".
Risposta originale:
Questa sembra essere una stranezza di traspolazione ES6 dattiloscritta. L' ...operatore dovrebbe lavorare su tutto ciò che ha una proprietà iteratore, (Accessed by obj[Symbol.iterator]) e Sets ha quella proprietà.
Per ovviare a questo, è possibile utilizzare Array.fromper convertire il set a un array prima: ...Array.from(new Set([1, 2, 3, 1, 1])).