配列の分割代入 (destructuring assignment)
配列の分割代入
JavaScriptでは、配列から要素を取り出す方法のひとつに、array[1]
のようにインデックスでアクセスする方法があります。この方法とは別に、分割代入(destructuring assignment)という方法を使っても、配列要素にアクセスできます。
たとえば、[1, 2, 3, 4, 5]
のような配列から、最初の3要素を取り出して変数に代入するには次のように書きます。
ts
constoneToFive = [1, 2, 3, 4, 5];const [one ,two ,three ] =oneToFive ;console .log (one );console .log (two );console .log (three );
ts
constoneToFive = [1, 2, 3, 4, 5];const [one ,two ,three ] =oneToFive ;console .log (one );console .log (two );console .log (three );
存在しない要素に対して分割代入した場合は、変数にundefined
が代入されます。JavaScriptではこれはエラーになりません。
js
constoneToFive = [1, 2];const [one ,two ,three ] =oneToFive ;console .log (three );
js
constoneToFive = [1, 2];const [one ,two ,three ] =oneToFive ;console .log (three );
TypeScriptでは、分割代入された値の型はT[]
の配列ならT
型になります。たとえば、number[]
型の[1, 2, 3, 4, 5]
から分割代入したのなら、型はnumber
になります。
ts
constoneToFive = [1, 2, 3, 4, 5];const [one ,two ,three ] =oneToFive ;constnum : number =one ; // oneはnumber型になるので代入できる
ts
constoneToFive = [1, 2, 3, 4, 5];const [one ,two ,three ] =oneToFive ;constnum : number =one ; // oneはnumber型になるので代入できる
ただしTypeScriptのコンパイラーオプションnoUncheckedIndexedAccess
を有効にした場合は異なります。
📄️ noUncheckedIndexedAccess
インデックス型のプロパティや配列要素を参照したときundefinedのチェックを必須にする
このオプション有効状態で、配列T[]
から分割代入するとT
型もしくはundefined型を示すT | undefined
型になります。たとえば、number[]
型の[1, 2, 3, 4, 5]
から分割代入したのなら、型はnumber | undefined
になります。
ts
constoneToFive = [1, 2, 3, 4, 5];const [one ,two ,three ] =oneToFive ;constnum : number =one ;// 上はコンパイルエラーになる。// oneはnumber | undefinedになり、numberには代入できないため。
ts
constoneToFive = [1, 2, 3, 4, 5];const [one ,two ,three ] =oneToFive ;constnum : number =one ;// 上はコンパイルエラーになる。// oneはnumber | undefinedになり、numberには代入できないため。
ネストした配列の分割代入
JavaScriptの分割代入はフラットな配列だけでなく、ネストした入れ子構造の配列からも要素を抽出できます。ネストした要素の分割代入の書き方は、ネスト構造と一致するようにブラケット([ ]
)を重ねます。
ts
consttwoByTwo = [[1, 2],[3, 4],];const [[one ,two ], [three ]] =twoByTwo ;console .log (one );console .log (two );console .log (three );
ts
consttwoByTwo = [[1, 2],[3, 4],];const [[one ,two ], [three ]] =twoByTwo ;console .log (one );console .log (two );console .log (three );
途中要素の分割代入
配列の分割代入は先頭からでなく、途中の要素を取り出すこともできます。その場合、取り出さない要素の数だけカンマを書きます。
ts
constoneToFive = [1, 2, 3, 4, 5];const [, , ,four ,five ] =oneToFive ;console .log (four );console .log (five );
ts
constoneToFive = [1, 2, 3, 4, 5];const [, , ,four ,five ] =oneToFive ;console .log (four );console .log (five );
残余部分の代入
JavaScriptの配列を分割代入するときに、残余パターン(...
)を用いて、配列の残りの部分を取り出して変数に代入できます。
ts
constoneToFive = [1, 2, 3, 4, 5];const [one , ...rest ] =oneToFive ;console .log (one );console .log (rest );
ts
constoneToFive = [1, 2, 3, 4, 5];const [one , ...rest ] =oneToFive ;console .log (one );console .log (rest );
このときTypeScriptでは、残余部分の型は配列のnumber[]
になります。
関連情報
📄️ 配列要素へのアクセス
JavaScriptでの配列要素アクセス
📄️ オブジェクトの分割代入
JavaScriptには、オブジェクトの分割代入(destructuring assignment)という便利な構文があります。分割代入は、オブジェクトからプロパティを取り出す機能です。