当サイトは、アフィリエイト広告を利用しています

typescriptの分割代入の使い方

作成日:2022月04月06日
更新日:2024年02月21日

typescript における分割代入をまとめる

分割代入とは

配列やオブジェクトを変数に分割して代入することができる

配列の分割代入

基本構文

sample.ts
// 配列を作成
const arr = Array.of(1, 2, 3);
// 分割代入
const [val1,val2] = ...arr
console.log(val1)
console.log(val2)
// ログ
// 1
// 2

constで宣言した場合は再代入できないが
letの場合はできる

sample.ts
// 配列を作成
const arr = Array.of(1, 2, 3, 4, 5);
// 分割代入
let [val1,val2] = arr
val1 = 2000
console.log(val1)
console.log(val2)
// ログ
// 2000
// 2

型推論について

typeScriptでは型推論が働く場合がある

sample.ts
// パターン①
// 配列を作成
const arr1 = [1, "abc", true]
// 分割代入
let [num1, str1, bool1] = arr1
// 型推論は働かないためエラー発生しない
num1 = 'moji'
str1 = 111
bool1 = false
// パターン②
// 型を指定してタプルを設定
const arr2: [number, string, boolean] = [1, "abc", true]
let [num2, str2, bool2] = arr2
// 型推論が働く
num2 = 'moji' //コンパイルエラー
str2 = 111 //コンパイルエラー
bool2 = false
// パターン③
// 右辺の配列リテラルは TypeScript ではタプル型とされる
let [num, str, bool] = [1, "abc", true]
// 型推論が働く
num = 'moji' //コンパイルエラー
str = 111 //コンパイルエラー
bool = false

配列の分割代入のサンプル

いつくかサンプル実装してみる

レスト構文

レスト構文を使うとあまりをまとめて代入できる

sample.ts
// 配列を作成
const arr = Array.of(1, 2, 3, 4, 5);
// 分割代入でレスト構文を使う
let [val1, val2,...rest] = arr;
console.log(val1);
console.log(val2);
console.log(rest);
// ログ
// 1
// 2
// (3) [3, 4, 5]

指定した要素だけとる

sample.ts
// 配列を作成
const arr = Array.of(1, 2, 3, 4, 5);
// 分割代入で指定して取得
let [val1, , , , val5] = arr;
console.log(val1);
console.log(val5);
// ログ
// 1
// 5

オブジェクトの分割代入

オブジェクトの中から必要な属性だけを抽出して変数に代入することができる。

基本構文

sample.ts
type User = {
id: number,
name:string,
age?:number
};
const user:User = { id: 1, name: "hogehoge" }
// idとnameだけ分割代入で取得する
const {id,name} = user
console.table(id)
console.log(name)
// ログ
// 1
// hogehoge

デフォルト値を設定

デフォルト値を設定することできる

sample.ts
// typeを定義
type User = {
id: number;
name?: string;
age?: number;
};
// オブジェクト作成
// idしか設定しない
const user: User = { id: 1 };
// idとnameだけ分割代入で取得する
// nameにはデフォルト値を設定
const { id, name = "defoult"} = user;
console.table(id);
console.log(name);
// ログ
// 1
// defoult

型アノテーション

分割代入の左辺には型アノテーションを指定できる
型アノテーションは個別、type,interfaceのどれでも設定可能。

sample.ts
export * from "./add";
// typeを定義
type User = {
id: number;
name?: string;
age?: number;
};
type User2 = {
id2: number;
name2?: string;
};
// オブジェクト作成
const user: User = { id: 1 };
const user2: User2 = { id2: 2 };
// idとnameだけ分割代入で取得する
// 型アノテーションを個別で設定
const { id, name = "defoult"}:{id:number,name?:string} = user;
// 型アノテーションをtypeで設定(interfaceでも可)
const { id2, name2 = "defoult2"}:User2 = user2;
console.table(id);
console.log(name);
console.table(id2);
console.log(name2);
// ログ
// 1
// defoult
// 2
// defoult2

リネーム

分割代入では別名を付けることも可能

sample.ts
// typeを定義
type User = {
id: number;
name: string;
age?: number;
};
// オブジェクト作成
const user: User = { id: 1, name: "hogehoge" };
// idとnameだけ分割代入で取得する
const { id, name: firstName }: { id: number; name?: string } = user;
console.table(id);
console.log(firstName);
// ログ
// 1
// hogehoge

分割代入後の型について

型は分割代入後も保持される。

sample.ts
// オブジェクトを定義
let user: {id:number,name:string,age:number} = {
id: 1,
name: "hoge",
age: 20
};
// 分割代入
let {id,age} = user
// 分割代入後も型は保持している
id = 'aaa' //エラー

オブジェクトの分割代入のサンプル

いつくかサンプル実装してみる

変数宣言してから代入したい場合

変数宣言と代入を別の行に分ける場合は少し書き方が異なる

sample.ts
export * from "./add";
// 空オブジェクトの型
type EmptyObject = { [key: string]: any };
// オブジェクトを定義
let user: EmptyObject = {
id: 1,
name: "hhoge",
age: 20
};
// 分割代入用の変数を定義
let id: number, age: number;
// 分割代入
// ()で囲まないとエラーになる
({id,age} = user)
console.table(id);
console.log(age);
// ログ
// 1
// 20

階層があるオブジェクトからの分割代入したい場合

分割代入側でも同じように階層を作ってやる必要がある。

sample.ts
// オブジェクトを定義
const user = {
id: 1,
detail: {
name: "hoge",
age: 21
}
};
// 階層別分割代入する
const {
detail: { name }
} = user;
console.log(name)

関数で分割代入を使用する

引数に分割代入を使用する事ができる

分割代入とレスト構文を使う

sample.ts
// 関数を定義
// 分割代入とレスト構文で受け取る
const func = ({id,name,...rest})=>{
console.log(id)
console.log(name)
console.log(rest.age)
}
// typeを定義
type User = {
id: number,
name:string,
age?:number
};
// オブジェクト作成
const user:User = { id: 1, name: "hogehoge",age:21 }
// 関数呼出し
func(user)
// 実行結果
// 1
// hogehoge
// 21

デフォルト値を設定

デフォルト値を設定してやると引数なしで呼び出すこともできる
デフォルト値を設定しない場合はエラーになる

sample.ts
/// 関数を定義
// デフォルト値を設定(まとめて設定)
const func = ({id,name}={id:0,name:"defoult"})=>{
console.log(id)
console.log(name)
}
// デフォルト値を設定(個別で設定)
const func2 = ({id=99,name="defoult99"}={})=>{
console.log(id)
console.log(name)
}
// 関数呼出し
func()
func2()
// ログ
// 0
// defoult
// 99
// defoult99

参考

下記の記事を参考してまとめさせて頂きました。 TypeScript と JSX の基礎文法を習得する

今さら分割代入知らないなんて言えないので TypeScript でこっそり勉強する

JavaScript: オブジェクトの分割代入とスプレッド構文を使ってみる

【React】関数コンポーネントの引数(props)は分割代入で渡すとわかりやすい

分割代入

新着記事

タグ別一覧
top