TypeScript PR

【TypeScript】オプショナルチェーン(?.)でnullチェックをすっきり書く方法

【TypeScript】オプショナルチェーン(?.)でnullチェックをすっきり書く方法
記事内に商品プロモーションを含む場合があります

こんにちは!

みなさんは、TypeScriptでコードを書いているときに、以下のようなエラーに遭遇したことはありませんか?

TypeError: Cannot read property 'address' of undefined
undefined のプロパティにアクセスしようとしてエラーが発生した…
深いネストの中のプロパティを安全に取得したい…
複数の条件分岐を書くのが面倒…

そんな悩みを抱えている人もいるのではないでしょうか。

この記事では、TypeScriptの便利な機能であるオプショナルチェーンについて、基本的な使い方から具体的な活用方法まで詳しく解説していきます。

この記事は、以下のような方におすすめです。

この記事はこんな人におすすめ!
  • TypeScriptでよりエレガントなコードを書きたい方
  • nullやundefinedによるエラーを防ぎたい方
  • オプショナルチェーンの使い方をマスターしたい方
  • コードの可読性を向上させたい方

この記事を読めば、オプショナルチェーンを使って安全で読みやすいコードを書けるようになります。さらに、具体的なユースケースとベストプラクティスまで余すことなくお伝えします。

それでは、順を追って詳しく見ていきましょう!

オプショナルチェーンとは

オプショナルチェーン(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.jsontargetが適切に設定されていることを確認しましょう。

{
  'compilerOptions': {
    'target': 'ES2020',  // ES2020以上を推奨
    'strict': true
  }
}

【付録】さらに学びを深めるためのリソース


intersection型について理解を深めたところで、さらに学習を進めたい方のために、いくつかのリソースを紹介します。
これらのリソースを活用することで、TypeScriptの型システムについてより深い知識を得ることができるでしょう。

おすすめの書籍


プロを目指す人のためのTypeScript入門


プロ開発者への近道!基礎から応用まで幅広くカバー

1一番のおすすめは「プロを目指す人のためのTypeScript入門」です。
この本は、TypeScriptの基礎から高度な使い方まで幅広く解説しています。

初心者でも理解しやすい説明から始まり、徐々に難易度を上げていく構成が特徴。
プログラミング経験者なら、さらに深い理解が得られるでしょう。

実際の開発現場で使えるテクニックも豊富に紹介されているのがポイント。
型の使い方や設計パターンなど、実践的な内容が満載です。

プロの開発者を目指す人はもちろん、TypeScriptをしっかり学びたい人におすすめの一冊。
基礎固めから応用力の向上まで、幅広いニーズに応えてくれます。

現場で使えるTypeScript 詳解実践ガイド


実践的スキルを身につけたい人必見!現場のノウハウが詰まった一冊

次におすすめは「現場で使えるTypeScript 詳解実践ガイド」がランクイン。
この本の特徴は、実際の開発現場で役立つ知識が詰まっていること。

TypeScriptの基本的な文法から始まり、実際のプロジェクトでどう活用するかまで丁寧に解説しています。
エラー対処法や性能改善のコツなど、現場ならではの知恵も満載。

特に、大規模なプロジェクトでTypeScriptを使う際のベストプラクティスが学べるのが魅力。
コードの保守性や再利用性を高める方法も詳しく紹介されています。

すでにJavaScriptの経験がある人や、実務でTypeScriptを使いたい人におすすめ。
この本を読めば、現場で即戦力として活躍できる力が身につくはずです。

書籍に関してはこちらの記事も参考にしてくださいね!




オンラインで参照できる公式ドキュメント


TypeScript公式ハンドブック


https://www.typescriptlang.org/docs/
TypeScriptの公式ドキュメントです。
intersection型を含む、すべての型システムの機能について詳細な説明があります。

TypeScript Deep Dive


https://basarat.gitbook.io/typescript/
TypeScriptの深い部分まで掘り下げて解説しているオンラインブックです。
無料で読むことができ、intersection型についても詳しく説明されています。

TypeScriptの学習は終わりがありません。
新しい機能が常に追加され、より良い書き方が発見されています。
継続的に学習を続けることで、より良いTypeScriptプログラマーになれるはずです。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

ここまで、TypeScriptのオプショナルチェーンについて詳しく解説してきました。重要なポイントを振り返りましょう。

  • オプショナルチェーンを使用することで、nullやundefinedのチェックを簡潔に書ける
  • プロパティアクセス、メソッド呼び出し、配列要素へのアクセスで使用可能
  • Nullish Coalescing演算子との組み合わせで、より柔軟な値の処理が可能
  • 過度な使用は避け、適切な場面で活用することが重要
  • 型ガードと組み合わせることで、より堅牢なコードを書ける

オプショナルチェーンは、TypeScriptの強力な機能の一つとして、コードの品質と開発効率の向上に大きく貢献します。ぜひ、日々のコーディングに取り入れてみてください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です