タイプスクリプトでスプレッド構文と新しいSet()を使用する


95

次のコードを使用して一意の番号を取得しています。

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

ただし、typescriptは次のエラーを報告します:Type'Set 'は配列型ではありません。 私はtypescript忍者ではありません、誰かがここで何が悪いのか教えてもらえますか?


4
使用しているバージョンがES2015をサポートしていると主張している場合、これは単なるTypescriptのバグだと思います。
とがった2015年

1
@Pointy申し訳ありませんが、1.6.2のバージョンのtscを含める必要があります
Eggy

回答:


46

これは欠落している機能です。TypeScriptは、現時点では配列の反復可能オブジェクトのみをサポートしています。


説明をありがとう。.filter()または他の何かを使用してジョブを実行します。また、この特定のエラーについてgithubでいくつかの問題を見つけました。今後のリリースでこれに注目します。
Eggy 2015年

103

更新"downlevelIteration": trueTypescript 2.3で、tsconfigに追加できるようになりました。これは、ES5をターゲットにしているときに機能します。

欠点downlevelIterationは、TSがトランスパイル時にかなりのボイラープレートを注入する必要があることです。質問からの1行は、21行のボイラープレートが追加されて発生します:( Typescript 2.6.1以降)

このボイラープレートは、ダウンレベルの反復を使用するファイルごとに1回注入されます。このボイラープレートは"importHelpers"、tsconfigのオプションを使用して減らすことができます。(ダウンレベルの反復については、このブログ投稿を参照してくださいimportHelpers

または、ES5のサポートが重要でない場合は、最初に「es6」をターゲットにすることができます。この場合、元のコードは「downlevelIteration」フラグを必要とせずに機能します。


元の答え:

これは、タイプスクリプトのES6トランスパイルの癖のようです。...オペレータは、イテレータ性を有しているもので動作するはずです(によってアクセスobj[Symbol.iterator])と設定し、そのプロパティを持っています。

これを回避Array.fromするには、最初にセットを配列に変換するために使用できます...Array.from(new Set([1, 2, 3, 1, 1]))


@Restam:tsconfig.jsonの "target": "es5"の場合、typescriptはIEのArray.fromにポリフィルを提供しますか?
jackOfAll 2017

1
@jackOfAllいいえ、Typescriptはプロトタイプのポリフィリングを行いません。「target」:「es5」を設定した場合、ポリフィルする必要のあるメソッドを使用しようとすると、コンパイラエラーが発生するはずです。
retsam 2017

1
@Restamの優れたソリューションArray.from。他のほとんどの人はこれをあきらめているようです。本当の解決策をありがとう!
rayepps 2017

これはバグではなく、es5ターゲットに対してサポートされていないだけです(github.com/Microsoft/TypeScript/issues/4031を参照)。tsconfigのリストに(、)以上Array.fromがある場合は機能するはずes2015です。es2017esnextlib
サイモンHänisch

1
@SimonHänischリンクをありがとう:私は答えを更新しました、私はもはやそれを「バグ」とは呼びませんが、おそらくより正確な用語である「トランスパイルの癖」と呼びます。また、そのリンクからダウンレベルの反復オプションに関する情報を追加しました。これにより、元の問題も解決されます。
retsam 2017年

73

Array.fromメソッドを使用して、セットを配列に変換することもできます

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


新しいアレイに再キャプチャするためだけにアレイを拡散することのポイントは何ですか?
Robby Cornelissen

1
tsconfigで「es6」をターゲットにできない場合。また、スプレッド演算子でセットを使用する必要がありますが、どのように行いますか?
ネイトゲッチ2018

重要なのは、を使用するArray.from()場合、spread演算子は不要になるということです。オーバーヘッドが増えるだけです。let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
Robby Cornelissen


1

Javascriptの場合:

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

Typescriptの場合:

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

React状態(setState)の場合:

setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));

0

これを機能させるには、tsconfig.jsonのcompilerOptionsに「target」:「ES6」(またはそれ以上)または「downlevelIteration」:trueが必要です。これで私の問題は解決し、うまく機能しました。それがあなたにも役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.