Saya menggunakan kode berikut untuk mendapatkan nomor unik:
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
Namun, laporan ketikan kesalahan berikut: Jenis 'Set' bukan jenis array. Saya bukan ninja naskah, bisakah seseorang memberi tahu saya apa yang salah di sini?
Jawaban:
Ini adalah fitur yang hilang. TypeScript hanya mendukung iterable pada Array saat ini.
sumber
Pembaruan : Dengan Typecript 2.3, Anda sekarang dapat menambahkan
"downlevelIteration": true
ke tsconfig Anda, dan ini akan bekerja sambil menargetkan ES5.Sisi negatifnya
downlevelIteration
adalah TS harus menginjeksikan cukup banyak boilerplate saat transpiling. Satu baris dari pertanyaan tersebut transparan dengan 21 baris boilerplate yang ditambahkan: (sesuai dengan Ketikan 2.6.1)Tampilkan cuplikan kode
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);
Boilerplate ini akan diinjeksi satu kali per file yang menggunakan iterasi downlevel, dan boilerplate ini dapat dikurangi menggunakan
"importHelpers"
opsi melalui tsconfig. (Lihat posting blog ini tentang iterasi downlevel danimportHelpers
)Alternatifnya, jika dukungan ES5 tidak penting bagi Anda, Anda selalu dapat menargetkan "es6" sejak awal, dalam hal ini kode asli berfungsi tanpa memerlukan panji "downlevelIteration".
Jawaban asli:
Ini tampaknya merupakan permainan kata-kata transpilasi ES6 yang diketik. The
...
Operator harus bekerja pada apa pun yang memiliki properti iterator, (Diakses olehobj[Symbol.iterator]
) dan Set memiliki properti itu.Untuk bekerja di sekitar ini, Anda dapat menggunakan
Array.from
untuk mengkonversi set ke array pertama:...Array.from(new Set([1, 2, 3, 1, 1]))
.sumber
Array.from
. Kebanyakan orang lain tampaknya menyerah begitu saja. terima kasih untuk solusi nyata!es5
target (lihat github.com/Microsoft/TypeScript/issues/4031 ).Array.from
harus berfungsi jika Anda memilikies2015
atau lebih tinggi (es2017
,esnext
) dalamlib
daftar Anda di tsconfig.Anda juga dapat menggunakan metode Array.from untuk mengubah Set ke Array
let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ; console.log(uniques);
sumber
Array.from()
, Anda tidak lagi membutuhkan operator penyebaran. Itu hanya menambah biaya overhead.let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
Anda perlu mengaturnya
"target": "es6",
di tsconfig Anda.sumber
Untuk membuatnya bekerja, Anda memerlukan "target": "ES6" (atau lebih tinggi) atau "downlevelIteration": true di compilerOptions tsconfig.json Anda. Ini menyelesaikan masalah saya dan bekerja dengan baik atau saya. Semoga ini akan membantu Anda juga.
sumber
Dalam Javascript:
[ ...new Set([1, 2, 3, 1, 1]) ]
Dalam Ketikan:
Array.from(new Set([1, 2, 3, 1, 1]))
Di React State (setState):
setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));
sumber