【TypeScript】オプショナルチェーン(?.)でnullチェックをすっきり書く方法
こんにちは!
みなさんは、TypeScriptでコードを書いているときに、以下のようなエラーに遭遇したことはありませんか?
TypeError: Cannot read property 'address' of undefined
そんな悩みを抱えている人もいるのではないでしょうか。
この記事では、TypeScriptの便利な機能であるオプショナルチェーンについて、基本的な使い方から具体的な活用方法まで詳しく解説していきます。
この記事は、以下のような方におすすめです。
- TypeScriptでよりエレガントなコードを書きたい方
- nullやundefinedによるエラーを防ぎたい方
- オプショナルチェーンの使い方をマスターしたい方
- コードの可読性を向上させたい方
この記事を読めば、オプショナルチェーンを使って安全で読みやすいコードを書けるようになります。さらに、具体的なユースケースとベストプラクティスまで余すことなくお伝えします。
それでは、順を追って詳しく見ていきましょう!
- 未経験で後悔したくない
【実体験】未経験からITエンジニアに転職して後悔した話|4社経験してわかった「最初の選択ミス」 - 年収が低くて不安
4年間ずっと年収260万だったエンジニアが、転職で510万になるまでの全記録
オプショナルチェーンとは
オプショナルチェーン(Optional Chaining)は、TypeScript 3.7で導入された機能で、オブジェクトのプロパティに安全にアクセスするための記法です。
?. という記号を使用することで、そのプロパティが存在しない場合でもエラーを発生させることなく、undefined を返すことができます。
従来の方法との比較
オプショナルチェーン導入前と後で、どのように書き方が変わるのか見てみましょう。
| 状況 | 従来の書き方 | オプショナルチェーンを使用 |
|---|---|---|
| ネストしたプロパティへのアクセス | user && user.address && user.address.street |
user?.address?.street |
| メソッド呼び出し | if (user && user.getName) { user.getName() } |
user?.getName?.() |
| 配列要素へのアクセス | if (users && users[0]) { users[0].name } |
users?.[0]?.name |
オプショナルチェーンを使用することで、コードがより簡潔で読みやすくなっていることがわかります。
オプショナルチェーンの基本的な使い方
では、具体的にオプショナルチェーンをどのように使用するのか、いくつかの例を見ていきましょう。
プロパティアクセス
最も基本的な使用方法は、オブジェクトのプロパティにアクセスする場合です。
interface User {
name: string;
address?: {
street: string;
city: string;
};
}
const user: User = {
name: '田中太郎'
};
// オプショナルチェーンを使用しない場合
const street1 = user.address ? user.address.street : undefined;
// オプショナルチェーンを使用する場合
const street2 = user?.address?.street; // undefined
メソッド呼び出し
オブジェクトのメソッドを安全に呼び出す場合にも使用できます。
interface User {
name: string;
getMessage?: () => string;
}
const user: User = {
name: '田中太郎'
};
// オプショナルチェーンを使用しない場合
const message1 = user.getMessage ? user.getMessage() : undefined;
// オプショナルチェーンを使用する場合
const message2 = user?.getMessage?.(); // undefined
配列要素へのアクセス
配列の要素に安全にアクセスする場合も、オプショナルチェーンを使用できます。
const users: User[] = [];
// オプショナルチェーンを使用しない場合
const firstName1 = users && users[0] ? users[0].name : undefined;
// オプショナルチェーンを使用する場合
const firstName2 = users?.[0]?.name; // undefined
オプショナルチェーンの活用シーン
オプショナルチェーンは、様々なシーンで活用できます。ここでは、具体的なユースケースを見ていきましょう。
APIレスポンスの処理
APIからのレスポンスデータを処理する場合、データの構造が不確実な場合があります。
interface ApiResponse {
data?: {
user?: {
profile?: {
email?: string;
};
};
};
}
async function getUserEmail(id: string): Promise<string | undefined> {
const response: ApiResponse = await fetchUserData(id);
// オプショナルチェーンを使用することで、安全にデータにアクセスできます
return response?.data?.user?.profile?.email;
}
フォームの入力値の処理
フォームの入力値を処理する際も、オプショナルチェーンが役立ちます。
interface FormEvent {
target?: {
elements?: {
[key: string]: {
value?: string;
};
};
};
}
function handleSubmit(event: FormEvent) {
// フォームの入力値を安全に取得
const email = event?.target?.elements?.email?.value;
const password = event?.target?.elements?.password?.value;
// 処理の続き...
}
Redux/状態管理での使用
状態管理ライブラリを使用する場合も、オプショナルチェーンで安全にステートにアクセスできます。
interface State {
auth?: {
user?: {
settings?: {
theme?: string;
};
};
};
}
function getTheme(state: State): string {
// デフォルト値との組み合わせ
return state?.auth?.user?.settings?.theme ?? 'light';
}
オプショナルチェーンのベストプラクティス
オプショナルチェーンを効果的に使用するために、いくつかのベストプラクティスを紹介します。
Nullish Coalescing演算子(??)との組み合わせ
オプショナルチェーンは、Nullish Coalescing演算子(??)と組み合わせることで、より柔軟な値の処理が可能になります。
interface User {
name: string;
settings?: {
theme?: string;
language?: string;
};
}
const user: User = {
name: '山田花子'
};
// デフォルト値の設定
const theme = user?.settings?.theme ?? 'light';
const language = user?.settings?.language ?? 'ja';
早期リターンとの併用
条件分岐を簡潔にするために、オプショナルチェーンと早期リターンを組み合わせることができます。
interface Order {
items?: {
product?: {
price?: number;
};
}[];
}
function calculateTotal(order: Order): number {
if (!order?.items?.length) {
return 0;
}
return order.items.reduce((total, item) => {
return total + (item?.product?.price ?? 0);
}, 0);
}
型ガードとの併用
型ガードと組み合わせることで、より堅牢なコードを書くことができます。
interface User {
id: string;
profile?: {
email?: string;
};
}
function isValidEmail(email: unknown): email is string {
return typeof email === 'string' && email.includes('@');
}
function processUserEmail(user: User): string {
const email = user?.profile?.email;
if (!email || !isValidEmail(email)) {
throw new Error('有効なメールアドレスが必要です');
}
return email;
}
オプショナルチェーンの注意点
オプショナルチェーンは便利な機能ですが、使用する際には以下の点に注意が必要です。
パフォーマンスへの影響
オプショナルチェーンは、各プロパティにアクセスする際に存在チェックを行います。深いネストが多い場合、パフォーマンスに影響を与える可能性があります。
// 多くのチェックが必要
const value = obj?.prop1?.prop2?.prop3?.prop4?.prop5;
// 型ガードを使用して一度チェックする方が効率的な場合も
if (obj && 'prop1' in obj) {
const value = obj.prop1.prop2.prop3.prop4.prop5;
}
過度な使用を避ける
必要以上にオプショナルチェーンを使用すると、コードの可読性が低下する可能性があります。
// 避けるべき例
const value = obj?.prop1?.prop2?.method?.()?.result?.value;
// より良い例
if (!obj?.prop1?.prop2) {
return;
}
const result = obj.prop1.prop2.method();
const value = result?.value;
コンパイル設定の確認
オプショナルチェーンを使用するには、TypeScriptのバージョンが3.7以上である必要があります。また、tsconfig.jsonのtargetが適切に設定されていることを確認しましょう。
{
'compilerOptions': {
'target': 'ES2020', // ES2020以上を推奨
'strict': true
}
}
【付録】さらに学びを深めるためのリソース
さらにTypescriptの学習を進めたい方のために、いくつかのリソースを紹介します。
これらのリソースを活用することで、TypeScriptの型システムについてより深い知識を得ることができるでしょう。
おすすめの書籍
ゼロからわかる TypeScript入門
技術評論社から出版されている「ゼロからわかる TypeScript入門」は、プログラミング初心者や本職プログラマーではない方を主な対象にした入門書です。
変数・条件分岐・ループといった基本から、クラスやインターフェース、モジュールまで段階的に学べる構成になっています。最終章ではWeb APIとJSONを使った非同期Webアプリの作成も体験できるので、「実際に動くものを作る」ところまで到達できます。
プロを目指す人のためのTypeScript入門
技術評論社の「プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで」、通称 ブルーベリー本 です。
JavaScriptの仕様とTypeScript独自の機能を両方押さえつつ、リテラル型・ユニオン型・keyof型・ジェネリクスなど、高度な型表現まで踏み込んで解説しています。TypeScriptの型システムの表現力を本格的に学べる一冊です。
オンラインで参照できる公式ドキュメント
TypeScript公式ハンドブック
https://www.typescriptlang.org/docs/
TypeScriptの公式ドキュメントです。
intersection型を含む、すべての型システムの機能について詳細な説明があります。
TypeScript Deep Dive
https://basarat.gitbook.io/typescript/
TypeScriptの深い部分まで掘り下げて解説しているオンラインブックです。
無料で読むことができ、intersection型についても詳しく説明されています。
TypeScriptの学習は終わりがありません。
新しい機能が常に追加され、より良い書き方が発見されています。
継続的に学習を続けることで、より良いTypeScriptプログラマーになれるはずです。
ひとつひとつ真摯に向き合う企業
株式会社 ONE WEDGEでは、新たな仲間を募集しています!
私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。
- 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
- 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇、有給6日取得で特別休暇付与)を完備!
- 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
- 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
- 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
- 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
- ワークライフバランスを重視し、副業もOK!
株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!
ホームページ、採用情報は下記ボタンからご確認ください!
応募、ご質問など、お問い合わせフォーム、またはX (旧Twitter)、InstagramのDMでお気軽にご相談ください♪
まとめ
ここまで、TypeScriptのオプショナルチェーンについて詳しく解説してきました。重要なポイントを振り返りましょう。
- オプショナルチェーンを使用することで、nullやundefinedのチェックを簡潔に書ける
- プロパティアクセス、メソッド呼び出し、配列要素へのアクセスで使用可能
- Nullish Coalescing演算子との組み合わせで、より柔軟な値の処理が可能
- 過度な使用は避け、適切な場面で活用することが重要
- 型ガードと組み合わせることで、より堅牢なコードを書ける
オプショナルチェーンは、TypeScriptの強力な機能の一つとして、コードの品質と開発効率の向上に大きく貢献します。ぜひ、日々のコーディングに取り入れてみてください。
※本記事の本文案はAIを活用して作成していますが、記載している内容およびコードは筆者が実際に調査、検証・実行し、内容の正確性を確認した上で公開しています。




