次のコードを使用して一意の番号を取得しています。
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
ただし、typescriptは次のエラーを報告します:Type'Set 'は配列型ではありません。 私はtypescript忍者ではありません、誰かがここで何が悪いのか教えてもらえますか?
次のコードを使用して一意の番号を取得しています。
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
ただし、typescriptは次のエラーを報告します:Type'Set 'は配列型ではありません。 私はtypescript忍者ではありません、誰かがここで何が悪いのか教えてもらえますか?
回答:
これは欠落している機能です。TypeScriptは、現時点では配列の反復可能オブジェクトのみをサポートしています。
更新:"downlevelIteration": true
Typescript 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]))
。
Array.from
。他のほとんどの人はこれをあきらめているようです。本当の解決策をありがとう!
es5
ターゲットに対してサポートされていないだけです(github.com/Microsoft/TypeScript/issues/4031を参照)。tsconfigのリストに(、)以上Array.from
がある場合は機能するはずes2015
です。es2017
esnext
lib
Array.fromメソッドを使用して、セットを配列に変換することもできます
let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ;
console.log(uniques);
Array.from()
場合、spread演算子は不要になるということです。オーバーヘッドが増えるだけです。let uniques = Array.from(new Set([1, 2, 3, 1, 1]));