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?


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.


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])).


@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);


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


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.


-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}])));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.