TypeScript Academy · レッスン

オプショナルな呼び出しと要素アクセス

安全なメソッド呼び出しとインデックスアクセスに?.()と?.[]を使います。

レッスン 4/413 ステップ

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

プロパティアクセス以外の形式

オプショナルチェーンはobj?.propに限られません。もう2つの形式があります。?.()を使うオプショナル呼び出しと、?.[index]を使うオプショナル要素アクセスです。どちらもプロパティアクセスと同様に、nullishの場合は短絡評価されます。

type Obj = { greet?: () => string };
const o: Obj = {};
console.log(o.greet?.()); // undefined, no crash

オプショナルメソッド呼び出し

obj.method?.()を使うと、メソッドが存在する場合にのみ呼び出せます。methodがnullまたはundefinedの場合、呼び出しはスキップされ、式の結果はundefinedになります。

type Logger = { log?: (m: string) => void };
const silent: Logger = {};
silent.log?.('hello'); // skipped, no error
console.log('continued safely');

?.の位置

?.は呼び出しの括弧の直前に置きます。obj.method?.()はmethodを確認するものであり、objは確認しません。objも保護するには、obj?.method?.()と記述します。

type Api = { send?: (x: number) => number };
const api: Api | null = null;
console.log(api?.send?.(5)); // undefined; guards both api and send

オプショナルコールバックの呼び出し

よくある用途の1つは、オプショナルなコールバック引数を呼び出すことです。ifで確認する代わりに、callback?.()と記述すれば、値が渡されている場合にのみ呼び出せます。

function run(onDone?: () => void): void {
  console.log('working...');
  onDone?.(); // call only if passed
}
run();
run(() => console.log('finished'));

オプショナル要素アクセス

nullishになる可能性がある配列やインデックスシグネチャには、arr?.[index]を使います。arrがnullishの場合、アクセスは短絡評価されます。それ以外の場合は、通常どおり要素を読み取ります。

const list: string[] | undefined = undefined;
console.log(list?.[0]); // undefined, no crash

動的キーによる要素アクセス

オプショナル要素アクセスは、nullishになる可能性があるオブジェクトの動的キーや計算キーに対して、ブラケット記法でも使用できます。

type Dict = { [key: string]: number };
const data: Dict | null = { a: 1, b: 2 };
const key = 'a';
console.log(data?.[key]); // 1

要素アクセスと呼び出しの組み合わせ

これらの形式は自由に組み合わせられます。オプショナルな配列の要素にアクセスし、さらにその要素のメソッドをオプショナルに呼び出せます。それぞれの?.が、対応する処理を保護します。

type Handlers = Array<{ fire?: () => string }>;
const hs: Handlers | undefined = [{ fire: () => 'boom' }];
console.log(hs?.[0]?.fire?.());

関数の戻り値に対するオプショナルチェーン

関数が返す値に対してもチェーンをつなげられます。関数の結果がnullishの場合、それ以降の呼び出しやアクセスは安全に短絡評価されます。

function getHandler(): (() => string) | undefined {
  return undefined;
}
console.log(getHandler()?.()); // undefined

結果の型にはundefinedが含まれる

プロパティチェーンと同様に、オプショナル呼び出しと要素アクセスは結果の型にundefinedを加えます。??と組み合わせてデフォルト値を指定すると、undefinedを取り除けます。

type Obj = { compute?: () => number };
const o: Obj = {};
const value = o.compute?.() ?? 0;
console.log(value);

イベントハンドラーの保護

UIやイベント処理では、オプショナル呼び出しを使うと設定されていない可能性があるハンドラーを簡潔に呼び出せます。冗長な存在確認は不要で、ハンドラーがなくてもエラーになりません。

type Props = { onClick?: (id: number) => void };
function click(p: Props, id: number): void {
  p.onClick?.(id); // safe if onClick is missing
}
click({ onClick: (id) => console.log('clicked', id) }, 7);
click({}, 8);

プラグインディスパッチャーの例

ここまでの内容を組み合わせます。nullishな値が含まれる可能性があるレジストリから名前付きプラグインフックをオプショナルに呼び出し、どのフックも処理しなかった場合は結果をデフォルト値にします。

type Hooks = { [name: string]: (() => string) | undefined };
const hooks: Hooks = { save: () => 'saved' };
function fire(name: string): string {
  return hooks[name]?.() ?? 'no handler';
}
console.log(fire('save'), fire('delete'));

クイックチェック

オプショナル呼び出しと要素アクセスについての理解度を確認しましょう。

まとめ:オプショナル呼び出しとアクセス

オプショナルチェーンのその他の形式について、次のことを学びました。

  • obj.method?.()は、メソッドが存在する場合にのみ呼び出します。
  • arr?.[index]は、nullishになる可能性があるコンテナから安全に要素を読み取ります。
  • どの形式も、オペランドがnullishの場合はundefinedに短絡評価されます。
  • ??と組み合わせて、結果にデフォルト値を設定できます。

次のコースでは、readonlyと不変性の基本を学びます。

type Cfg = { init?: () => void };
const c: Cfg = {};
c.init?.();
console.log('ran safely');
無料で開始

AI チューターと学ぶ TypeScript — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
101
レッスン
352

よくある質問

「オプショナルな呼び出しと要素アクセス」レッスンは無料ですか?

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

「オプショナルな呼び出しと要素アクセス」で何を学びますか?

安全なメソッド呼び出しとインデックスアクセスに?.()と?.[]を使います。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「オプショナルな呼び出しと要素アクセス」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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