iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

TypeScriptでよく見る「?」「!」について調べてみた

□はじめに

こんにちは!株式会社iimonでフロントエンドエンジニアを担当している「奥島さん」です!

今回は新機能追加やバグ修正の際に、非nullアサーション(!)とオプショナルチェイニング(?)の使い方に確信が持てなかったため、正しく使うために改めて調べてみました!

□なぜ非nullアサーション(!)とオプショナルチェイニング(?)が必要なの〜

nullやundefinedを安全に扱い、コードの可読性とメンテナンス性を向上させるために必要みたいです。 非nullアサーション(!)とオプショナルチェイニング(?)について役割と必要な理由についてみていきましょう。

□ (!) (Non-null assertion operator / 非null アサーション)ってなーに?

非nullアサーション(!)は、変数やオブジェクトのプロパティが「絶対にnullやundefinedではない」と確信した時に記載する記号です。このアサーションを使うことで、TypeScriptのコンパイラに「この値は必ず存在しているので、nullやundefinedのチェックは不要」と伝えることができるので便利ですね!

const human1 = {
    name: "ameku",
    age: "40",
};
  
const human2 = {
    name: "hideki",
    details: {
      age: "46",  // ageプロパティは存在する
    },
};
  

//出力結果!!
console.log(human1.age); // 出力は「40」
  
//human2.detailsプロパティがあり、その中の{ age: "46" }です。この場合、detailsが必ず存在することを確認しているため、非nullアサーション(!)を使用できますね。
console.log(human2.details!.age); // 出力は「46」

非nullアサーション(!)は、値が必ず存在することを前提に使用します。具体的には、「この値は絶対にある」と確信した場合に使います。しかし、もしその値が実際にnullやundefinedであった場合、実行時にエラーが発生します。そのため、非nullアサーションは「確信がある場合」のみ使用することが重要かと思います!

□ (?) (Optional chaining / オプショナルチェイニング)ってなーに?

オプショナルチェイニング(?.)は、変数やオブジェクトのプロパティにアクセスする際にnullやundefinedかわからない時に記載する記号です。 このオプショナルを使うことで、nullやundefinedが含まれる可能性があるオブジェクトに対して、安全にアクセスできるようになり安心して居眠りできますね。


//human1 には details プロパティがあり、その中に age: 40 が含まれています。
const human1 = {
  name: "ameku",
  details: {
    age: 40,
  },
};


//human2 には details プロパティが存在せず、name プロパティのみが定義されています。
const human2 = {
  name: "hideki",
};


//出力結果!!
//オプショナルチェイニング(?.)があればエラーになりません!
console.log(human1.details.age); // 出力は「30」
console.log(human2.details?.age); // 出力は「undefined」

//オプショナルチェイニング(?.)がないとCannot read properties of undefined (reading 'age') 「未定義のプロパティを読み込めません」とエラーになります。
 console.log(human2.details.age); 

オプショナルチェイニング(?.)を使わないでhuman2.details.age にアクセスしようとすると、Cannot read properties of undefined (reading 'age') 「未定義のプロパティを読み込めません」というエラーが発生してしまいます。 オプショナルチェイニング(?.)は値が存在するかどうかわからない場合に使います!!!

□まとめ!?

「非nullアサーション(!)とオプショナルチェイニング(?)について、正しく理解できていなかったため、改めて確認し、理解できました。

今後はこれらを適切に使って、より安全で効率的なコードを書くように心掛けます。 ここまで読んでくださってありがとうございました。

□参考記事

developer.mozilla.org

JavaScriptのundefinedエラーを回避する方法【徹底解説!】|Kevi Log (ケビろぐ!)

■ 募集

弊社ではエンジニアを募集しております。

ぜひカジュアル面談でお話ししましょう!

ご興味ありましたら、ご応募ください!

Wantedly / Green