//
Busca en todas las páginas de la documentación
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Tipifica correctamente manejadores de eventos de React para clics, envíos de formularios, cambios de entrada, eventos de teclado y callbacks de eventos personalizados. Usa los tipos de eventos sintéticos de React para seguridad de tipos completa.
// Evento de clic
function handleClick(event: React.MouseEvent<HTMLButtonElement>) {
console.log("Botón clickeado en", event.clientX, event.clientY);
}
// Evento de envío de formulario
function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
event.preventDefault();
const formData = new FormData(event.currentTarget);
const email = formData.get("email") as string;
console.log("Enviado:", email);
}
// Evento de cambio de entrada
function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
console.log("Valor:", event.target.value);
}
// Evento de teclado
function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {
if (event.key === "Enter") {
console.log("Intro presionado");
}
}// Componente de formulario completo
function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
console.log({ email, password });
};
return (
<form onSubmit={handleSubmit}>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Escape") setEmail("");
}}
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Iniciar Sesión</button>
</form>
);
}SyntheticEvent. TypeScript proporciona tipos de eventos genéricos como React.MouseEvent<T> donde T es el tipo del elemento HTML.event.target se tipifica como EventTarget, que es amplio. Usa event.currentTarget para el elemento al que se adjunta el manejador -- está tipificado como el parámetro genérico (HTMLButtonElement, HTMLInputElement, etc.).onChange={(e) => ...}), TypeScript infiere el tipo de evento automáticamente desde el atributo JSX.Select y textarea:
function handleSelectChange(event: React.ChangeEvent<HTMLSelectElement>) {
console.log("Seleccionado:", event.target.value);
}
function handleTextareaChange(event: React.ChangeEvent<HTMLTextAreaElement>) {
console.log("Texto:", event.target.value);
}Eventos de arrastre:
function handleDragStart(event: React.DragEvent<HTMLDivElement>) {
event.dataTransfer.setData("text/plain", "dragged");
}Eventos de enfoque:
function handleFocus(event: React.FocusEvent<HTMLInputElement>) {
event.currentTarget.select();
}Props de callback de evento personalizado:
type SearchBarProps = {
onSearch: (query: string) => void;
onClear?: () => void;
};
function SearchBar({ onSearch, onClear }: SearchBarProps) {
const [query, setQuery] = useState("");
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
onSearch(query);
};
return (
<form onSubmit={handleSubmit}>
<input value={query} onChange={(e) => setQuery(e.target.value)} />
<button type="submit">Buscar</button>
{onClear && <button type="button" onClick={onClear}>Limpiar</button>}
</form>
);
}React.MouseEvent, React.ChangeEvent, React.FormEvent, React.KeyboardEvent, React.FocusEvent, React.DragEvent, React.TouchEvent, React.WheelEvent.currentTarget. Por ejemplo, React.MouseEvent<HTMLAnchorElement> le da a currentTarget el tipo HTMLAnchorElement.React.SyntheticEvent es el tipo base para todos los eventos de React. Úsalo cuando no te importa el tipo de evento específico.event.target vs event.currentTarget: target es el elemento que desencadenó el evento (podría ser un hijo), mientras que currentTarget es el elemento al que se adjunta el manejador. TypeScript tipifica currentTarget más precisamente.event.target.value en un evento de envío de formulario causará un error porque EventTarget no tiene una propiedad value. Cástéalo o usa currentTarget.event.preventDefault() en el envío del formulario causa una recarga de página completa.| Enfoque | Ventajas | Desventajas |
|---|---|---|
| Funciones flecha inline | TypeScript infiere el tipo de evento automáticamente | Crea una nueva función en cada renderizado |
| Funciones manejadoras nombradas | Reutilizables, probables, sin re-creación | Debe anotar manualmente el tipo de evento |
Tipo React.EventHandler<E> | Alias de tipo de manejador conciso | Menos común, ligeramente más difícil de leer |
Prop de callback (p. ej., onSearch: (q: string) => void) | Desacopla el padre de eventos DOM | El padre no tiene acceso al evento sin procesar |
Manejador envuelto useCallback | Referencia estable para hijos memoizados | Boilerplate adicional |
event.target es el elemento que desencadenó el evento (podría ser un elemento hijo).event.currentTarget es el elemento al que se adjunta el manejador.currentTarget más precisamente según el parámetro genérico.onChange={(e) => ...} obtienen su tipo del contexto del atributo JSX.function handleChange(e: React.ChangeEvent<HTMLInputElement>).React.MouseEvent<T> -- clics, movimiento del ratón.React.ChangeEvent<T> -- cambios en entrada, select, textarea.React.FormEvent<T> -- envíos de formularios.React.KeyboardEvent<T> -- pulsaciones de teclas.React.FocusEvent<T> -- enfoque y desenfoque.event.target se tipifica como EventTarget, que no tiene una propiedad value.event.currentTarget (tipificado como el elemento del formulario) o casta event.target.new FormData(event.currentTarget).type SearchBarProps = {
onSearch: (query: string) => void;
onClear?: () => void;
};onSearch(query)) en lugar del evento DOM sin procesar.event.currentTarget.React.MouseEvent<HTMLButtonElement> significa que currentTarget se tipifica como HTMLButtonElement.event.preventDefault() en la parte superior de los manejadores de envío de formularios.clientX, key).function handleSelectChange(event: React.ChangeEvent<HTMLSelectElement>) {
console.log("Seleccionado:", event.target.value);
}React.ChangeEvent<HTMLSelectElement> -- no HTMLInputElement.value es el valor de cadena de la opción seleccionada.event.persist().persist().Revisado por Chris St. John·Última actualización: 7 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥