new Set使用時にTypeScriptに怒られない方法

new Set使用時にTypeScriptに怒られない方法

2023/05/04

2023/05/07

TypeScriptでnew Set[...array]を使用しようとしたとき、
以下のエラーが表示されました。

'Set<unknown>' の種類は、'--downlevelIteration' フラグを使用している場合、または 'es2015' 以降の '--target' を使用している場合にのみ反復処理できます。

解決方法

tsconfig.jsonに"downlevelIteration": trueを追加します。

{
 "compilerOptions": {
  "target": "es2015",
  "downlevelIteration": true // 追加
 }
}


上記設定が必要な理由

ChatGPTに質問すると、以下のように説明されました。
ES2015以降のfor...ofループを使用できるようにするための記述のようです。

Set<unknown>型が反復処理できない理由は、TypeScriptがES2015より前のバージョンのJavaScriptに変換する際に、反復処理に使用されるJavaScriptの構文が変更されたためです。
具体的には、ES2015以前のJavaScriptでは、反復処理のためにfor...ofループを使用することができませんでした。代わりに、for...inループが使用されていました。しかし、for...inループはオブジェクトのプロパティを列挙するために設計されており、SetやMapなどのコレクションオブジェクトの要素を列挙するために使用すると、望ましくない振る舞いを示す可能性があります。
ES2015では、新しい反復プロトコルが導入され、for...ofループが導入されました。for...ofループは、反復可能なオブジェクト(ArrayやSetなど)から要素を順番に取り出して反復するために設計されています。
--downlevelIterationフラグを使用することで、TypeScriptコンパイラはES2015以降のJavaScriptに変換することができ、for...ofループを使用してSetやMapなどの反復可能なオブジェクトを反復処理できるようになります。