オプショナルチェーン (optional chaining)
JavaScriptのオプショナルチェーン?.
は、オブジェクトのプロパティが存在しない場合でも、エラーを起こさずにプロパティを参照できる安全な方法です。
プロパティ参照がエラーになる問題
JavaScriptではnull
やundefined
のプロパティを参照するとエラーが発生します。
js
constbook =undefined ;consttitle =book .title ;constauthor = null;constauthor .
js
constbook =undefined ;consttitle =book .title ;constauthor = null;constauthor .
エラーを避けるには、値がnull
やundefined
でないかチェックする必要があります。
js
constbook =undefined ;consttitle =book === null ||book ===undefined ?undefined :book .title ;console .log (title );
js
constbook =undefined ;consttitle =book === null ||book ===undefined ?undefined :book .title ;console .log (title );
js
constbook = {title : "サバイバルTypeScript" };consttitle =book === null ||book ===undefined ?undefined :book .title ;console .log (title );
js
constbook = {title : "サバイバルTypeScript" };consttitle =book === null ||book ===undefined ?undefined :book .title ;console .log (title );
ネストしたオブジェクトの場合、チェック処理はいっそう複雑になってきます。
js
constbook = {author : {constauthorEmail =book === null ||book ===undefined ?undefined :book .author === null ||book .author ===undefined ?undefined :book .author .
js
constbook = {author : {constauthorEmail =book === null ||book ===undefined ?undefined :book .author === null ||book .author ===undefined ?undefined :book .author .
チェックすればエラーなく動きますが、記述量が多くなるという課題もあります。
オプショナルチェーン
JavaScriptのオプショナルチェーンはnull
やundefined
のプロパティを誤って参照しないようにしつつ、記述量を抑えられる書き方です。オプショナルチェーンは?.
演算子を用いて書きます。
js
constbook =undefined ;consttitle =book ?.title ;// ^^オプショナルチェーンconsole .log (title );
js
constbook =undefined ;consttitle =book ?.title ;// ^^オプショナルチェーンconsole .log (title );
js
constbook = {title : "サバイバルTypeScript" };consttitle =book ?.title ;console .log (title );
js
constbook = {title : "サバイバルTypeScript" };consttitle =book ?.title ;console .log (title );
オプショナルチェーンはネストして使うこともできます。
js
constbook =undefined ;constauthorEmail =book ?.author ?.console .log (authorEmail );
js
constbook =undefined ;constauthorEmail =book ?.author ?.console .log (authorEmail );
js
constbook = {author : {constauthorEmail =book ?.author ?.console .log (authorEmail );
js
constbook = {author : {constauthorEmail =book ?.author ?.console .log (authorEmail );
もしも?.
に先行する変数やプロパティの値がnull
またはundefined
のときは、その先のプロパティは評価されず、undefined
が返ります。
js
constbook = null;console .log (book ?.title );
js
constbook = null;console .log (book ?.title );
js
constbook = {author : null };console .log (book .author ?.name );
js
constbook = {author : null };console .log (book .author ?.name );
関数呼び出し
関数を呼び出すときにもオプショナルチェーンが使えます。関数に使う場合は、引数カッコの前に?.
を書きます。
js
constincrement =undefined ;constresult =increment ?.(1);console .log (result );
js
constincrement =undefined ;constresult =increment ?.(1);console .log (result );
js
constincrement = (n ) =>n + 1;constresult =increment ?.(1);console .log (result );
js
constincrement = (n ) =>n + 1;constresult =increment ?.(1);console .log (result );
メソッドを呼び出すときも同様の書き方です。
js
constbook = {getPrice :undefined };console .log (book .getPrice ?.());
js
constbook = {getPrice :undefined };console .log (book .getPrice ?.());
js
constbook = {getPrice () {return 0;},};console .log (book .getPrice ?.());
js
constbook = {getPrice () {return 0;},};console .log (book .getPrice ?.());
配列要素の参照
配列要素を参照する際にもオプショナルチェーンが使えます。要素を参照する場合は、カギカッコの前に?.
を書きます。
js
constbooks =undefined ;consttitle =books ?.[0];console .log (title );
js
constbooks =undefined ;consttitle =books ?.[0];console .log (title );
js
constbooks = ["サバイバルTypeScript"];consttitle =books ?.[0];console .log (title );
js
constbooks = ["サバイバルTypeScript"];consttitle =books ?.[0];console .log (title );
TypeScriptでの型
TypeScriptでオプショナルチェーンを使った場合、得られる値の型は、最後のプロパティの型とundefined
のユニオン型になります。
ts
letbook : undefined | {title : string };consttitle =book ?.title ;
ts
letbook : undefined | {title : string };consttitle =book ?.title ;
TypeScriptのコンパイル結果
TypeScriptのコンパイラーオプションtarget
がes2020
以上のときは、オプショナルチェーンはそのままJavaScriptにコンパイルされます。
ts
const title = book?.title;
ts
const title = book?.title;
target
がes2019
以前の場合は、次のような三項演算子を用いたコードにコンパイルされます。
ts
const title = book === null || book === void 0 ? void 0 : book.title;
ts
const title = book === null || book === void 0 ? void 0 : book.title;
Null合体演算子と組み合わせる
オプショナルチェーンがundefined
を返したときに、デフォルト値を代入したい場合があります。その際には、Null合体演算子??
を用いると便利です。
js
constbook =undefined ;consttitle =book ?.title ?? "デフォルトタイトル";console .log (title );
js
constbook =undefined ;consttitle =book ?.title ?? "デフォルトタイトル";console .log (title );
学びをシェアする
・JavaScriptのオプショナルチェーン?.は安全にプロパティを参照する方法
・値がnullかundefinedのときundefinedが返る
・a?.b?.cのようにネストも可能
・関数は?.()
・配列は?.[]
・TypeScriptでは値の型とundefinedのユニオン型になる
・Null合体演算子と相性がいい
『サバイバルTypeScript』より
関連情報
📄️ 配列要素へのアクセス
JavaScriptでの配列要素アクセス
📄️ 三項演算子
JavaScriptの三項演算子(ternary operator)は、条件分岐ができる演算子です。条件式、真の場合の値、偽の場合の値の三項を取るため三項演算子と呼ばれています。