Korzystanie ze składni rozkładania i nowego Set () z maszynopisem

91

Używam następującego kodu, aby uzyskać unikalne numery:

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

Jednak maszynopis zgłasza następujący błąd: Typ „Set” nie jest typem tablicy. Nie jestem ninja maszynopisu, czy ktoś mógłby mi powiedzieć, co tu jest nie tak?

Eggy
źródło
4
Myślę, że to tylko błąd maszynopisu, jeśli wersja, której używasz, twierdzi, że obsługuje ES2015.
Pointy
1
@Pointy Przepraszam za to, powinienem dołączyć wersję tsc czyli 1.6.2
Eggy

Odpowiedzi:

39

To jest brakująca funkcja. W tej chwili TypeScript obsługuje tylko iteracje w tablicach.

basarat
źródło
Dzięki za wyjaśnienie. Użyję .filter () lub czegoś innego, aby wykonać zadanie. Znalazłem również kilka problemów na githubie dotyczących tego konkretnego błędu. Będę miał na to oko w przyszłych wydaniach.
Eggy
95

Aktualizacja : dzięki Typescript 2.3 możesz teraz dodać "downlevelIteration": truedo swojego tsconfig, co będzie działać podczas kierowania na ES5.

Wadą tego downlevelIterationjest to, że TS będzie musiał wprowadzić sporo gotowej płyty podczas transpilacji. Pojedyncza linia z pytania przenosi się z 21 liniami dodanego schematu: (jak w Typescript 2.6.1)

Ten standardowy szablon zostanie wprowadzony raz na plik, który używa iteracji niższego poziomu, a ten szablon można zmniejszyć za pomocą "importHelpers"opcji za pośrednictwem tsconfig. (Zobacz ten post na blogu o iteracji niższej wersji iimportHelpers )

Alternatywnie, jeśli obsługa ES5 nie ma dla ciebie znaczenia, zawsze możesz najpierw skierować na "es6", w którym to przypadku oryginalny kod działa bez konieczności używania flagi "downlevelIteration".


Oryginalna odpowiedź:

To wydaje się być dziwactwem transpilacji w maszynopisie ES6. ...Operator powinien działać na cokolwiek, co ma właściwość iteracyjnej, (dostęp przez obj[Symbol.iterator]) oraz zestawy posiadają tę właściwość.

Aby obejść ten problem, można użyć Array.fromdo konwersji zestawu do tablicy pierwszy: ...Array.from(new Set([1, 2, 3, 1, 1])).

Retsam
źródło
@Restam: Czy maszynopis zawiera wypełnienia dla Array.from w IE, jeśli „target”: „es5” w tsconfig.json?
jackOfAll
1
@jackOfAll Nie, Typescript nie wykonuje dla Ciebie żadnego wypełniania prototypów. Jeśli ustawisz „target”: „es5”, przy próbie użycia metody, która musi zostać wypełniona, powinien dać ci błąd kompilatora.
Retsam
1
@Restam świetne rozwiązanie z Array.from. Większość innych ludzi po prostu z tego rezygnuje. dzięki za prawdziwe rozwiązanie!
rayepps
To nie jest błąd, po prostu nie obsługują go dla es5celu (patrz github.com/Microsoft/TypeScript/issues/4031 ). Array.frompowinno działać, jeśli masz es2015lub wyższą ( es2017, esnext) na libliście w tsconfig.
Simon Hänisch
1
@ SimonHänisch Dzięki za link: zaktualizowałem swoją odpowiedź, nie nazywam tego już „błędem”, ale „dziwactwem transpilacji”, który jest prawdopodobnie dokładniejszym terminem. Dodałem również informacje o opcji iteracji niższego poziomu z tego linku, co również rozwiązuje oryginalny problem.
Retsam
67

Możesz również użyć metody Array.from, aby przekonwertować zestaw na Array

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

Nate Getch
źródło
Jaki jest sens rozprzestrzeniania tablicy tylko po to, aby ponownie ją przechwycić w nowej macierzy?
Robby Cornelissen
1
Jeśli nie jest możliwe kierowanie na "es6", w tsconfig. A użycie Ustaw z operatorem spreadu jest wymagane, jak byś to zrobił?
Nate Getch,
Chodzi o to, że jeśli używasz Array.from(), nie potrzebujesz już operatora spreadu. Po prostu dodaje narzut. let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
Robby Cornelissen
8

Musisz ustawić "target": "es6",w swoim pliku tsconfig.

phil294
źródło
0

Aby to zadziałało, potrzebujesz „target”: „ES6” (lub nowszego) lub „downlevelIteration”: true w opcji compilerOptions twojego tsconfig.json. To rozwiązało mój problem i działa dobrze lub dla mnie. Mam nadzieję, że to również pomoże.

Mayur Saner
źródło
-1

W JavaScript:

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

W maszynie:

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

W stanie reakcji (setState):

setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));
Najathi
źródło