TypeScriptにおけるイベント処理
この記事ではTypeScriptにおけるイベント処理について説明します。
イベント処理の方法やカスタムイベントについてコードを通して学べます。
YouTube Video
TypeScriptにおけるイベント処理
TypeScriptにおけるイベント処理は、JavaScriptと同様に行いますが、TypeScriptでは型安全性が向上しているため、適切なイベント型を利用して安全にイベントを処理できます。イベント処理の基本は、DOM要素にイベントリスナーを追加して、ユーザーの操作に応じて処理を実行することです。
イベントリスナーの追加
イベントリスナーは、addEventListener
メソッドを使ってDOM要素に追加します。例えば、クリックイベントを処理する場合は次のようにします。
1const button = document.getElementById('myButton');
2if (button) {
3 button.addEventListener('click', (event) => {
4 console.log('Button was clicked');
5 });
6}
- このコードでは、
addEventListener
を使って指定したDOM要素にクリックイベント発生時の処理を登録します。
TypeScriptでのイベントの型
TypeScriptでは、イベントリスナーで受け取る event
オブジェクトに適切な型が自動的に付与されます。event
オブジェクトは、イベントの種類に応じて異なるプロパティを持っていますが、基本となる型は Event
です。
イベントごとに適切な型を利用することで、TypeScriptの型安全性を活かした開発ができます。
主要なイベント型
Event
Event
は、一般的なイベントの基本型です。フォーム送信やページの読み込み完了などに使用されます。
1const form = document.getElementById('myForm');
2if (form) {
3 form.addEventListener('submit', (event: Event) => {
4 event.preventDefault(); // Prevent the default form submission
5 console.log('Form was submitted');
6 });
7}
- このコードは、フォームの送信イベントを検知してデフォルトの送信動作を防ぎ、代わりにメッセージをコンソールに出力します。
-
MouseEvent
MouseEvent
は、クリック、マウス移動などのマウス操作に関連するイベント型です。マウスの座標やクリックしたボタンに関する情報を取得できます。
1const button = document.getElementById('myButton');
2if (button) {
3 button.addEventListener('click', (event: MouseEvent) => {
4 // Log the click position
5 console.log(`Click position: X=${event.clientX}, Y=${event.clientY}`);
6 });
7}
- このコードは、ボタンがクリックされた際にマウス座標を取得してコンソールに表示します。
KeyboardEvent
KeyboardEvent
は、キーボード入力に関連するイベント型です。押されたキーや修飾キー(Shift、Alt、Ctrlなど)の状態にアクセスできます。
1document.addEventListener('keydown', (event: KeyboardEvent) => {
2 // Log the pressed key
3 console.log(`Key pressed: ${event.key}`);
4 if (event.ctrlKey) {
5 // Log that the Ctrl key was pressed
6 console.log('Ctrl key was pressed');
7 }
8});
- このコードは、キーが押されたときに押されたキー名を表示し、Ctrlキーが同時に押されていればその情報もコンソールに出力します。
InputEvent
InputEvent
は、入力フィールドの変更に関連するイベント型です。テキストフィールドやテキストエリアなどの値が変更された際に利用されます。
1const input = document.getElementById('myInput') as HTMLInputElement;
2if (input) {
3 input.addEventListener('input', (event: InputEvent) => {
4 // Log the entered value
5 console.log(`Entered value: ${input.value}`);
6 });
7}
- このコードは、入力フィールドの値が変更されるたびにその内容をコンソールに表示します。
FocusEvent
FocusEvent
は、要素がフォーカスを得た時や失った時に発生するイベント型です。
1const input = document.getElementById('myInput');
2if (input) {
3 input.addEventListener('focus', (event: FocusEvent) => {
4 // Log when the input gains focus
5 console.log('Focused');
6 });
7
8 input.addEventListener('blur', (event: FocusEvent) => {
9 // Log when the input loses focus
10 console.log('Blurred');
11 });
12}
- このコードは、入力フィールドがフォーカスされたときに「Focused」、フォーカスを失ったときに「Blurred」とコンソールに表示します。
型アサーションを使ったカスタムイベントの処理
カスタムイベントや、TypeScriptの型推論が効かない場合には、型アサーションを使って明示的に型を指定することができます。
例えば、特定の入力フィールド(HTMLInputElement
)に対してイベントを処理する場合は、次のように型を指定します。
1const input = document.getElementById('myInput') as HTMLInputElement;
2if (input) {
3 input.addEventListener('input', (event: Event) => {
4 const target = event.target as HTMLInputElement;
5 // Log the entered value
6 console.log(`Entered value: ${target.value}`);
7 });
8}
- このコードは、型アサーションを使ってイベントの対象要素を
HTMLInputElement
として扱い、その入力値をコンソールに表示します。
イベントリスナーの削除
イベントリスナーは removeEventListener
を使って削除できます。これには、最初に追加した時と同じイベントハンドラを渡す必要があります。
1const button = document.getElementById('myButton');
2
3const handleClick = (event: MouseEvent) => {
4 // Log when the button is clicked
5 console.log('Button was clicked');
6};
7
8if (button) {
9 button.addEventListener('click', handleClick);
10
11 // Remove the event listener later
12 button.removeEventListener('click', handleClick);
13}
- このコードは、ボタンにクリックイベントリスナーを追加した後、同じハンドラを指定して削除します。
カスタムイベントの作成
TypeScriptでは、標準のイベントに加えてカスタムイベントを作成し、発火させることも可能です。CustomEvent
クラスを使ってカスタムイベントを作成し、dispatchEvent
メソッドで発火させます。
1const customEvent = new CustomEvent('myCustomEvent', { detail: { name: 'TypeScript' } });
2const div = document.getElementById('myDiv');
3
4if (div) {
5 div.addEventListener('myCustomEvent', (event: CustomEvent) => {
6 // Log when the custom event is fired
7 console.log(`Custom event was triggered: ${event.detail.name}`);
8 });
9
10 div.dispatchEvent(customEvent); // Dispatch the custom event
11}
- このコードは、
CustomEvent
を使ってカスタムイベントを作成し、要素に対して発火させ、その詳細情報をコンソールに表示します。
イベント伝播の制御
イベントが発生すると、デフォルトではイベントはバブリング(親要素に伝播)します。これを防ぐためには、event.stopPropagation()
を使います。また、preventDefault()
を使って、ブラウザのデフォルト動作を防止することも可能です。
1const button = document.getElementById('myButton');
2if (button) {
3 button.addEventListener('click', (event: MouseEvent) => {
4 event.preventDefault(); // Prevent the default action
5 event.stopPropagation(); // Stop the event propagation
6
7 // Log that event handling has been customized
8 console.log('Custom event handling');
9 });
10}
- このコードは、ボタンのクリック時にデフォルト動作を無効化し、イベントのバブリングも停止させてカスタム処理を実行します。
まとめ
TypeScriptでのイベント処理は、基本的にJavaScriptと同じですが、適切な型定義があるため、イベントオブジェクトやDOM要素に対して安全かつ確実な操作が可能です。イベントリスナーの追加・削除、イベント型の適用、型アサーションを活用することで、イベント処理がより明確でエラーの少ないコードを実現できます。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。