Ich verwende folgenden Code, um eindeutige Nummern zu erhalten:
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
Typoskript meldet jedoch folgenden Fehler: Typ 'Set' ist kein Array-Typ. Ich bin kein Typoskript-Ninja. Kann mir jemand sagen, was hier falsch ist?
Antworten:
Dies ist eine fehlende Funktion. TypeScript unterstützt derzeit nur iterables auf Arrays.
quelle
Update : Mit Typescript 2.3 können Sie jetzt
"downlevelIteration": true
zu Ihrer tsconfig hinzufügen. Dies funktioniert beim Targeting von ES5.Der Nachteil
downlevelIteration
ist, dass TS beim Transpilieren ziemlich viel Boilerplate einspritzen muss. Die einzelne Zeile aus der Frage wird mit 21 Zeilen hinzugefügter Boilerplate transpiliert: (ab Typescript 2.6.1)Code-Snippet anzeigen
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);
Diese Boilerplate wird einmal pro Datei injiziert, die eine Downlevel-Iteration verwendet, und diese Boilerplate kann mithilfe der
"importHelpers"
Option über die tsconfig reduziert werden . (Siehe diesen Blogpost zur Downlevel-Iteration undimportHelpers
)Wenn die ES5-Unterstützung für Sie keine Rolle spielt, können Sie alternativ immer zuerst "es6" als Ziel festlegen. In diesem Fall funktioniert der ursprüngliche Code, ohne das Flag "downlevelIteration" zu benötigen.
Ursprüngliche Antwort:
Dies scheint eine maschinengeschriebene ES6-Transpilations-Eigenart zu sein. Der
...
Operator sollte an allem arbeiten, was eine Iterator-Eigenschaft hat (Zugriff durchobj[Symbol.iterator]
), und Sets haben diese Eigenschaft.Um dies zu umgehen, können Sie
Array.from
den Satz zuerst in ein Array konvertieren :...Array.from(new Set([1, 2, 3, 1, 1]))
.quelle
Array.from
. Die meisten anderen Leute scheinen dies einfach aufzugeben. Danke für eine echte Lösung!es5
Ziel (siehe github.com/Microsoft/TypeScript/issues/4031 ).Array.from
sollte funktionieren, wenn Siees2015
oder höher (es2017
,esnext
) in Ihrerlib
Liste in tsconfig haben.Sie können auch die Array.from-Methode verwenden, um das Set in Array zu konvertieren
let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ; console.log(uniques);
quelle
Array.from()
den Spread-Operator nicht mehr benötigen. Es fügt nur Overhead hinzu.let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
Sie müssen
"target": "es6",
in Ihrer tsconfig einstellen.quelle
Damit es funktioniert, benötigen Sie entweder "target": "ES6" (oder höher) oder "downlevelIteration": true in den compilerOptions Ihrer tsconfig.json. Dies hat mein Problem gelöst und funktioniert gut oder ich. Ich hoffe, es wird Ihnen auch helfen.
quelle
In Javascript:
[ ...new Set([1, 2, 3, 1, 1]) ]
Im Typoskript:
Array.from(new Set([1, 2, 3, 1, 1]))
Im Reaktionszustand (setState):
setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));
quelle