イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み
正しい型でDOMイベントを処理し、CustomEventのペイロードを作成して、HTMLElementサブタイプを安全に絞り込みます
「イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。
はじめに
目標: 型付きイベントリスナーを追加し、安全に要素の型を絞り込み、ペイロード付きのCustomEventを発生させます。
- イベントの型(MouseEvent、KeyboardEvent、InputEvent)
- target/currentTargetをinstanceofで絞り込む
- CustomEventのdetailペイロード
型付きリスナー
リスナーのシグネチャにはイベント名に応じた型が付きます。click → MouseEvent、keydown → KeyboardEventのようになります。明確にするため、明示的な型注釈を追加します。
const btn = document.querySelector("#btn");
if (btn) {
btn.addEventListener("click", (ev: MouseEvent) => {
console.log("x=", ev.clientX, "y=", ev.clientY);
});
}
window.addEventListener("keydown", (ev: KeyboardEvent) => {
console.log("key=", ev.key);
});targetとcurrentTargetの違い
targetは元の発生元で、さまざまな型になり得ます。一方、currentTargetはリスナーを受け取る要素です。要素APIを使う前にinstanceofで型を絞り込みます。
document.addEventListener("input", (ev: InputEvent) => {
const t = ev.target;
const c = ev.currentTarget; // here: Document
if (t instanceof HTMLInputElement) {
console.log("value=", t.value);
}
});CustomEventのペイロード
CustomEvent<T>は、型付きのdetailペイロードを保持します。対応するジェネリック型引数を使って発生させ、処理します。
type CounterDetail = { delta: number };
const inc = new CustomEvent<CounterDetail>("counter:change", {
detail: { delta: 1 }
});
document.dispatchEvent(inc);
document.addEventListener("counter:change", (ev: CustomEvent<CounterDetail>) => {
console.log("delta=", ev.detail.delta);
});サブタイプの絞り込み
instanceofを使って、特定のHTML要素クラス(例: HTMLButtonElement、HTMLAnchorElement)まで絞り込みます。
document.addEventListener("click", (ev: MouseEvent) => {
const el = ev.target;
if (el instanceof HTMLButtonElement) {
el.disabled = true; // safe: HTMLButtonElement API
} else if (el instanceof HTMLAnchorElement) {
console.log("href=", el.href);
}
});委譲とガード
イベント委譲: 上位の要素(document)でリッスンし、一致する要素を見つけて、APIにアクセスする前に型を絞り込みます。
document.addEventListener("click", (ev: MouseEvent) => {
const el = ev.target as Element | null;
if (!el) return;
const btn = el.closest("button.btn-primary");
if (btn instanceof HTMLButtonElement) {
console.log("delegated click on:", btn.textContent);
}
});絞り込みの確認
簡単な確認: イベントハンドラーで要素固有のAPIにアクセスする最も安全な方法は何でしょうか?
まとめ
まとめ: イベント名からイベントの型が決まります。target/currentTargetはinstanceofで型を絞り込み、データはCustomEvent<T>のdetailに格納します。
よくある質問
「イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み」レッスンは無料ですか?
はい。「イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。
「イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み」で何を学びますか?
正しい型でDOMイベントを処理し、CustomEventのペイロードを作成して、HTMLElementサブタイプを安全に絞り込みます ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- libのDOM型とquerySelector(strict null checks)
- イベントの型、カスタムイベント、HTMLElementサブタイプの絞り込み
- FormData、URL、URLSearchParamsの操作