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