Я использую следующий код для получения уникальных номеров:
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
Однако машинописный текст сообщает об ошибке: Тип «Set» не является типом массива. Я не машинописный ниндзя, может кто-нибудь сказать мне, что здесь не так?
Ответы:
Это недостающая функция. На данный момент TypeScript поддерживает итерации только в массивах.
источник
Обновление : с помощью Typescript 2.3 теперь вы можете добавить
"downlevelIteration": true
в свой tsconfig, и это будет работать при ориентации на ES5.Недостатком
downlevelIteration
является то , что TS придется вводить совсем немного шаблонный , когда transpiling. Единственная строка из вопроса транслируется с 21 строкой добавленного шаблона: (с Typecript 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);
Этот шаблон будет внедрен один раз в файл, который использует итерацию нижнего уровня, и этот шаблон можно уменьшить, используя
"importHelpers"
параметр через tsconfig. (См. Это сообщение в блоге об итерации нижнего уровня иimportHelpers
)В качестве альтернативы, если поддержка ES5 для вас не имеет значения, вы всегда можете просто настроить таргетинг на «es6», и в этом случае исходный код будет работать без флага «downlevelIteration».
Оригинальный ответ:
Это похоже на причуду машинописной транспиляции ES6.
...
Оператор должен работать на все , что имеет свойство итератора, (к которым обращаетсяobj[Symbol.iterator]
) и наборы имеют это свойство.Чтобы обойти эту проблему , вы можете использовать ,
Array.from
чтобы преобразовать набор в массив первым:...Array.from(new Set([1, 2, 3, 1, 1]))
.источник
Array.from
. Большинство людей просто отказываются от этого. спасибо за реальное решение!es5
цели (см. Github.com/Microsoft/TypeScript/issues/4031 ).Array.from
должен работать, если в вашем списке в tsconfig естьes2015
или выше (es2017
,esnext
)lib
.Вы также можете использовать метод Array.from для преобразования Set в Array
let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ; console.log(uniques);
источник
Array.from()
, вам больше не нужен оператор спреда. Это просто увеличивает накладные расходы.let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
Вам нужно установить
"target": "es6",
в вашем tsconfig.источник
В Javascript:
[ ...new Set([1, 2, 3, 1, 1]) ]
В машинописном тексте:
Array.from(new Set([1, 2, 3, 1, 1]))
В состоянии реакции (setState):
setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));
источник
Чтобы заставить его работать, вам нужно либо «target»: «ES6» (или выше), либо «downlevelIteration»: true в compilerOptions вашего tsconfig.json. Это решило мою проблему и работает хорошо или я. Надеюсь, это поможет и вам.
источник