0Pricing
TypeScript Academy · レッスン

?.と??の組み合わせ

オプショナルチェーンと適切なデフォルト値を組み合わせます。

「?.と??の組み合わせ」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

相性のよい組み合わせ

オプショナルチェーンと Null 合体演算子は、組み合わせて使えるように設計されています。obj?.value ?? fallbackというパターンを使うと、ネストした値を安全に読み取り、値がない場合はデフォルト値を指定できます。これは現代の TypeScript で最も便利なイディオムの1つです。

type User = { profile?: { name?: string } };
const u: User = {};
const name = u.profile?.name ?? 'Anonymous';
console.log(name);

パターンの仕組み

まず?.がチェーンを評価し、値またはundefinedを返します。次に??がその結果を確認し、null またはundefinedであればフォールバック値を使います。2つの演算子で、すっきりした1つの式になります。

type Cfg = { server?: { port?: number } };
const cfg: Cfg = { server: {} };
const port = cfg.server?.port ?? 8080;
console.log(port);

結果の型

チェーンの結果はT | undefinedになります。??によってundefinedが取り除かれ、フォールバック値の型がユニオンに加わります。フォールバック値の型が一致していれば、最終的な型は単にTとなり、処理すべきundefinedは残りません。

type Cfg = { timeout?: number };
const cfg: Cfg = {};
const timeout: number = cfg.timeout ?? 30;
console.log(timeout + 5); // number, safe arithmetic

有効な falsy 値を保持する

??は null またはundefinedの場合にだけ動作するため、チェーンを通じて取得した正当な0はそのまま保持されます。フォールバック値が使われるのは、プロパティが本当に存在しない場合だけです。

type Audio = { settings?: { volume?: number } };
const a: Audio = { settings: { volume: 0 } };
console.log(a.settings?.volume ?? 50); // 0, not 50

深くネストした設定へのアクセス

深くネストした設定にアクセスする場合は、複数の?.をチェーンし、最後に1つの??を置きます。途中のどこかが存在しなくても、デフォルト値へ適切にフォールバックできます。

type Cfg = { db?: { pool?: { max?: number } } };
const cfg: Cfg = { db: {} };
const maxPool = cfg.db?.pool?.max ?? 10;
console.log(maxPool);

API レスポンスのデフォルト値

API レスポンスでは、オプショナルなフィールドが省略されることがよくあります。この組み合わせたパターンを使えば、それらを安全に読み取り、適切なデフォルト値を設定できます。その結果、後続のコードをシンプルに保ち、クラッシュを防げます。

type Res = { data?: { items?: string[] } };
const res: Res = { data: {} };
const items = res.data?.items ?? [];
console.log('Item count:', items.length);

メソッドの結果と組み合わせる

関数やメソッドの呼び出し結果に対してチェーンし、その結果にデフォルト値を設定することもできます。呼び出し結果が null またはundefinedなら、フォールバック値が使われます。

type Store = { find?: () => string | undefined };
const store: Store = { find: () => undefined };
const result = store.find?.() ?? 'default';
console.log(result);

冗長なガードを避ける

これらの演算子がなければ、複数行の null チェックを書くことになります。この組み合わせたイディオムなら、コード全体を1つの式に置き換えられるため、安全性を保ちながら読みやすさを向上できます。

type User = { name?: string };
const u: User = {};
// Old: let n; if (u && u.name) n = u.name; else n = 'Guest';
const n = u?.name ?? 'Guest';
console.log(n);

別の検索へフォールバックする

??の後ろに置くフォールバック値自体を、別のチェーンによる検索にすることもできます。これにより、最後にリテラルのデフォルト値を使う前に、別の情報源を試せます。

type Prefs = { theme?: string };
const userPrefs: Prefs = {};
const sitePrefs: Prefs = { theme: 'light' };
const theme = userPrefs?.theme ?? sitePrefs?.theme ?? 'dark';
console.log(theme);

要素アクセスと組み合わせる

このパターンは配列要素へのアクセスにも使えます。?.[i]を通じて要素を読み取り、??でデフォルト値を指定できます。

type Data = { tags?: string[] };
const d: Data = { tags: [] };
const first = d.tags?.[0] ?? 'none';
console.log(first);

実用的な設定リーダー

すべてを組み合わせると、オプショナルな階層を安全にたどり、利用可能な値を必ず返す設定リーダーを作れます。これは実務の TypeScript で頻繁に使う書き方です。

type Settings = { ui?: { lang?: string } };
function getLang(s: Settings): string {
  return s.ui?.lang ?? 'en';
}
console.log(getLang({ ui: { lang: 'tr' } }), getLang({}));

理解度チェック

?. と ?? の組み合わせについて、理解度を確認しましょう。

まとめ: ?. と ?? の組み合わせ

obj?.value ?? fallbackというイディオムを学びました。

  • ?.はチェーンを安全にたどり、値またはundefinedを返します。
  • ??は、結果が null またはundefinedの場合にだけデフォルト値を指定します。
  • 最終的な型からundefinedが取り除かれ、多くの場合はシンプルなTになります。
  • 0のような有効な falsy 値は保持されます。

次は、オプショナルな呼び出しとオプショナルな要素アクセスです。

type Cfg = { limit?: number };
const c: Cfg = {};
const limit = c?.limit ?? 100;
console.log(limit);

よくある質問

「?.と??の組み合わせ」レッスンは無料ですか?

はい。「?.と??の組み合わせ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「?.と??の組み合わせ」で何を学びますか?

オプショナルチェーンと適切なデフォルト値を組み合わせます。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「?.と??の組み合わせ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ?.によるオプショナルチェーン
  2. ??によるNull合体
  3. ?.と??の組み合わせ
  4. オプショナルな呼び出しと要素アクセス
← TypeScript Academyに戻る