Forma sözdizimi ve yeni Set () tür komutuyla


92

Benzersiz numaralar almak için aşağıdaki kodu kullanıyorum:

let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]

Ancak, aşağıdaki hatayı bildiren typecript raporu: 'Set' türü bir dizi türü değil. Ben typcript ninja değilim, biri bana burada neyin yanlış olduğunu söyleyebilir mi?


4
ES2015'i desteklemek için kullandığınız sürüm iddiaları varsa, bu sadece bir Typescript hatasıdır.
Pointy

1
Bunun için üzgünüm @Pointy, ben 1.6.2 Tsc sürümünü içermelidir
Yumurtalı

Yanıtlar:


40

Bu eksik bir özelliktir. TypeScript şu anda yalnızca Diziler üzerinde yinelenebilir değerleri desteklemektedir.


Açıklama için teşekkürler. İşi yapmak için .filter () veya başka bir şey kullanacağım. Ayrıca bu özel hata hakkında github'da birkaç sorun buldum. Gelecek sürümlerde buna göz kulak olacağım.
Yumurtalı

96

Güncelleme : Typescript 2.3 ile artık "downlevelIteration": truetsconfig'inize ekleyebilirsiniz ve bu ES5 hedeflenirken çalışacaktır.

Bunun dezavantajı, downlevelIterationTS'nin aktarım sırasında epeyce standart metin enjekte etmesi gerekecek olmasıdır. 21 satırlık standart şablon eklenmiş soru yığınlarından tek satır: (Typecript 2.6.1 itibariyle)

Bu standart şablon, alt düzey yinelemeyi kullanan dosya başına bir kez enjekte edilecektir ve bu standart "importHelpers"şablon tsconfig aracılığıyla seçenek kullanılarak azaltılabilir . ( Alt düzey yinelemeyle ilgili bu blog yayınına bakın ve importHelpers)

Alternatif olarak, ES5 desteği sizin için önemli değilse, her zaman ilk etapta "es6" yı hedefleyebilirsiniz, bu durumda orijinal kod "downlevelIteration" bayrağına ihtiyaç duymadan çalışır.


Orijinal cevap:

Bu bir typcript ES6 transpilation tuhaflığı gibi görünüyor. ...Operatör bir yineleyici özelliği, (Eriştiği sahiptir şey üzerinde çalışması gerekir obj[Symbol.iterator]) ve Setleri o özelliği vardır.

Bu çevrede çalışmaları için kullanabilirsiniz Array.fromilk bir diziye dönüştürmek ayarlayın: ...Array.from(new Set([1, 2, 3, 1, 1])).


@Restam: Typescript, tsconfig.json içinde "target": "es5" ise IE'de Array.from için polyfill'ler sağlıyor mu?
jackOfAll

1
@jackOfAll Hayır, Typescript sizin için herhangi bir çoklu doldurma prototipi yapmaz. "Target": "es5" olarak ayarlarsanız, çoklu doldurulması gereken bir yöntemi kullanmaya çalışırsanız, size bir derleyici hatası vermelidir.
Retsam

1
@Restam ile harika bir çözüm Array.from. Çoğu insan bundan vazgeçiyor gibi görünüyor. gerçek bir çözüm için teşekkürler!
rayepps

Bu bir hata değil, sadece es5hedef için desteklemiyorlar (bkz. Github.com/Microsoft/TypeScript/issues/4031 ). tsconfig'deki listenizde ( , ) Array.fromvarsa es2015veya daha yüksekse çalışmalıdır . es2017esnextlib
Simon Hänisch

1
@ SimonHänisch Bağlantı için teşekkürler: Cevabımı güncelledim, buna artık bir "hata" değil, muhtemelen daha doğru bir terim olan "aktarma tuhaflığı" diyorum. Ayrıca bu bağlantıdan alt seviye yineleme seçeneği hakkında bilgi ekledim ve bu da orijinal sorunu çözdü.
Retsam

67

Set'i Array'e dönüştürmek için Array.from yöntemini de kullanabilirsiniz.

let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ;
console.log(uniques);


Diziyi sadece yeni bir dizide yeniden ele geçirmek için yaymanın ne anlamı var?
Robby Cornelissen

1
Tsconfig içinde "es6" hedeflemek mümkün değilse. Ve Serpme operatörü ile Set kullanmak gereklidir, bunu nasıl yaparsınız?
Nate Getch

Önemli olan şu ki, kullanıyorsanız Array.from()artık yayma operatörüne ihtiyacınız yok. Sadece ek yük getirir. let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
Robby Cornelissen

8

"target": "es6",Tsconfig'inizi ayarlamanız gerekir .


0

Çalışması için, tsconfig.json dosyanızın compilerOptions dosyasında "target": "ES6" (veya daha yüksek) veya "downlevelIteration": true değerine ihtiyacınız vardır. Bu benim sorunumu çözdü ve iyi çalışıyor ya da bana yardımcı olur umarım.


0

Javascript'te:

[ ...new Set([1, 2, 3, 1, 1]) ]

Typescript'te:

Array.from(new Set([1, 2, 3, 1, 1]))

React Durumunda (setState):

setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.