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