TypeScript

useEventListener — Typed Wrapper

admin by @admin ADMIN
5m ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
A type-safe useEventListener for window, document, or any element ref. Picks the right event-map automatically so the handler argument is correctly typed (MouseEvent, KeyboardEvent, etc.).
TypeScript
Raw
import { useEffect, useRef, RefObject } from 'react';

export function useEventListener<K extends keyof WindowEventMap>(
  type: K,
  handler: (event: WindowEventMap[K]) => void,
  element?: undefined | null,
): void;
export function useEventListener<K extends keyof HTMLElementEventMap, T extends HTMLElement>(
  type: K,
  handler: (event: HTMLElementEventMap[K]) => void,
  element: RefObject<T>,
): void;
export function useEventListener(type: string, handler: (e: Event) => void, element?: any): void {
  const saved = useRef(handler);
  useEffect(() => { saved.current = handler; }, [handler]);

  useEffect(() => {
    const target = element?.current ?? window;
    if (!target?.addEventListener) return;
    const listener: EventListener = (e) => saved.current(e);
    target.addEventListener(type, listener);
    return () => target.removeEventListener(type, listener);
  }, [type, element]);
}

useEventListener('keydown', e => { if (e.key === 'Escape') closeAll(); });
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.