「!」と「?」は何を意味するのか?TypeScriptでよく見る記号の正体

プログラミング学習

TypeScriptのコードを読んでいると、
突然こんな記号が出てきます。

const btn = document.getElementById("add")!;
user?.name

「!って何?」
「?は三項演算子じゃないの?」
と混乱した人も多いはずです。

私自身、DOM操作をTypeScriptで書き始めた頃、
エラーを消すために意味も分からず ! を付けていました。

結論から言うと、
これらは TypeScriptの型安全を保つための記号 です。


「!」の意味(ノンヌルアサーション)

const btn = document.getElementById("add")!;

この ! は、

「この値は null や undefined ではありません」

コンパイラに断言する記号 です。

TypeScriptは安全のため、

document.getElementById("add");

HTMLElement | null になると警告します。

それに対し ! を付けると、

HTMLElement

として扱われます。


注意点:実行時の安全は保証しない

const el = document.getElementById("none")!;
el.textContent = "test"; // 実行時エラー

!
型チェックを黙らせるだけ で、
実行時の安全までは保証しません。


「?」の意味①:オプショナルチェイニング

user?.name

これは、

userが存在する場合だけ name を取得する

という意味です。

if (user) {
  user.name
}

を短く書いたものです。


なぜ必要なのか

JavaScriptでは、

null.name

のようなアクセスは即エラーになります。

?. を使えば、

  • null / undefined の場合は undefined を返す
  • エラーで止まらない

という安全な挙動になります。


「?」の意味②:オプショナルプロパティ

type User = {
  name: string;
  age?: number;
};

この ? は、

このプロパティはあってもなくてもよい

という意味です。

APIレスポンスやフォーム入力など、
不確定なデータを扱う場面で必須 になります。


なぜこれらの記号が重要なのか

TypeScriptは、

バグを「実行前」に減らす

ための言語です。

  • ! → 開発者の責任で保証する
  • ? → 不確実性を許容する

という役割分担があります。

DOM操作やAPI通信など、
不確実な世界と向き合うための道具 だと考えると理解しやすくなります。


まとめ

  • ! は「nullではないと断言する」
  • ?. は「安全にアクセスする」
  • ?(型定義)は「存在しない可能性を許可する」

意味を理解せず使うと危険ですが、
理解した上で使えば TypeScript最大の武器 になります。

コメント

タイトルとURLをコピーしました