次のコードを使用して一意の番号を取得しています。
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": 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]))。
Array.from。他のほとんどの人はこれをあきらめているようです。本当の解決策をありがとう!
es5ターゲットに対してサポートされていないだけです(github.com/Microsoft/TypeScript/issues/4031を参照)。tsconfigのリストに(、)以上Array.fromがある場合は機能するはずes2015です。es2017esnextlib
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]));