HTMLElement/Event DOM 型

最終更新:2026-10-22

HTMLElement/Event DOM 型

DOM プログラミングの型はすべて TS 組み込みの DOM lib から来ます。要素には継承の階層(EventTarget → Node → Element → HTMLElement → HTMLInputElement など)があり、イベントのオブジェクトは target を持っています。正確な型はナローイングで手に入れます。instanceof で HTMLElement を具体的なサブクラスに絞り込んで初めて .value といった固有のプロパティにアクセスできます。イベントのコールバックの中も同様で、e.target も絞り込んで初めて意味があります。

グループ設定と実践
種類構文
strict モード不要

ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。

📝 構文

// 要素のナローイング:instanceof で具体的なサブクラスへ絞り込む
function setText(el: HTMLElement, text: string) {
  if (el instanceof HTMLInputElement) {
    el.value = text;        // ナローイングして初めて .value がある
  } else {
    el.textContent = text;  // 普通の要素は textContent を使う
  }
}

// イベントのナローイング:e.target は EventTarget | null
function onClick(e: Event) {
  const t = e.target;
  if (t instanceof HTMLInputElement) {
    console.log(t.value);   // ナローイング後のみアクセス可能
  }
}

⚙️ パラメータ

HTMLElementすべての HTML 要素の共通の基底クラスです。.textContent/.style などの汎用のメンバーしかなく、querySelector は既定では Element を返します。具体的なタグはジェネリックパラメータで絞り込めます
HTMLInputElement入力欄の具体的なサブクラスで、.value/.name/.checked を追加で持ちます。「絞り込んで初めてメンバーが使える」典型例です
Event.targetイベントが実際に起きた要素で、型は EventTarget | null です(window、document の可能性もあります)。ほぼ必ず instanceof で絞り込んでから使うことになります

戻り値:ナローイング自体に戻り値はありません。コンパイラがその分岐の中で参照を「より正確な型として見る」ようにするだけで、実行時のコストはゼロです。

▶ サンプル

下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:

出力:

input.value = "dev@example.com"
textContent = "Welcome"
input "email" = "dev@example.com"
clicked <HTMLElement>

(トランスパイル後の実行出力。この例では本物の DOM の代わりにスタブクラスを使っています。同じ instanceof の書き方はブラウザの中で本物の要素に対しても有効です。DOM のコードはブラウザの中で動かす必要があります)

💡 ポイント

ℹ️ 説明 要素の階層の連鎖は覚える価値があります。EventTarget → Node → Element → HTMLElement → 具体的なタグ(HTMLInputElement/HTMLDivElement...)です。階層が上ほどメンバーは少なく、具体的に絞り込むほど使えるメンバーが増えます。
💡 ヒント querySelector はジェネリックで一発で書けます。document.querySelector<HTMLInputElement>('#email') は HTMLInputElement | null を返し、instanceof を省けます。ただし実行時には何も検証されないので、要素が本当に input であるときだけ安全です。
⚠️ 注意 e.target と e.currentTarget を混同しないでください。target は実際にクリックされた要素で(リスナーを付けた要素ではない可能性があり、null のこともあります)、currentTarget はリスナーをバインドした要素です。フォームで値を取るときは e.currentTarget がおすすめです(具体的なイベント型のコールバックシグネチャと組み合わせるとさらに正確です)。
ケースは今後追加予定です。

📚 関連チュートリアル

❓ よくある質問

Q document.querySelector の戻り値の型に null が含まれるのはなぜですか?
A セレクタがどの要素にも合致しない可能性があるからです。strictNullChecks がこの null の処理(if による空判定や ?. によるアクセス)を強制します。厳格モードが最も「うっとうしい」と同時に最も「命を救う」典型の場面です。
Q 型エラーを出さずに input の value を取るには?
A まず HTMLInputElement 型を手に入れます。querySelector<HTMLInputElement>("#id") を使うか、ジェネリックな Element に instanceof HTMLInputElement でナローイングます。そのままの HTMLElement では .value にアクセスできません。そのプロパティはサブクラスにあるからです。
Q addEventListener のコールバックの引数で正確なイベント型を得るには?
A DOM lib はよく使うイベント名にオーバーロードを用意しています。el.addEventListener("input", (e) => ...) の中の e は自動的に対応する Event のサブ型になります。さらに HTMLElement のタグのジェネリック(querySelector<HTMLInputElement>)と組み合わせれば target をさらに絞り込めます。オーバーロードのないイベント名だけ手動のアサーションが必要です。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%