cover

Cómo tipar eventos en React con TypeScript

author photo

Héctorbliss

@hectorbliss

Mira el video:

Uno de los retos iniciales cuando usamos TypeScript con React es conocer cómo tipar los eventos que provienen de nuestros elementos. Por ejemplo, cuando empleamos un input y queremos escribir su handler: ¿qué tipo de dato debemos usar? Eso vamos a ver en este post.

Eventos del DOM

Cuando un handler (manejador de eventos) se ejecuta, React le envía por argumento un evento sintético llamado SyntheticEvent, este objeto envuelve al evento nativo del navegador y le brinda una interfaz con mayor compatibilidad.

Desde el punto de vista de TypeScript podemos usar justamente ese tipo genérico, pero tenemos opciones más específicas para los casos más comunes:

OnChange

Este quizá es uno de los manejadores de eventos más comunes, se declara en elementos de formularios como inputs, checkboxes o selects. Para el caso de un input y empleando TypeScript, este sería un ejemplo de cómo tiparlo:

Pasamos <HTMLInputElement> para especificar que el elemento de destino (target) de nuestro evento es un input.


🎬 ¿Prefieres ver esto en acción? Tenemos tutoriales de TypeScript y React en nuestro canal de YouTube.


onSubmit

Otro manejador muy común es el onSubmit que usamos para escuchar cuando un formulario es enviado. Aquí tenemos el tipo FormEvent:

Nota que usamos event.currentTarget en lugar de event.target. Esto es porque currentTarget siempre hace referencia al elemento donde se adjuntó el listener (el form), mientras que target puede ser cualquier elemento dentro del form que disparó el evento (como el botón).

Para cualquier otro evento puedes usar SyntheticEvent

El tipo SyntheticEvent es un tipo genérico que engloba a todos los eventos en React. Para eventos como onMouseOver, onFocus, onBlur, etc., puedes usar los tipos específicos:

EventoTipo en TypeScript
onChangeChangeEvent<T>
onSubmitFormEvent<T>
onClickMouseEvent<T>
onKeyDown / onKeyUpKeyboardEvent<T>
onFocus / onBlurFocusEvent<T>
onDragDragEvent<T>
onScrollUIEvent<T>
onTouchStart / onTouchEndTouchEvent<T>
Cualquier eventoSyntheticEvent<T>

Donde T es el tipo del elemento HTML, por ejemplo HTMLInputElement, HTMLButtonElement, HTMLDivElement, etc.

Nota sobre acceso asíncrono al evento

Si necesitas acceder a las propiedades del evento de forma asíncrona (por ejemplo, después de un await o dentro de un setTimeout), React recicla el objeto del evento por razones de rendimiento.

En versiones anteriores de React necesitabas llamar a e.persist() para conservar el evento:

A partir de React 17, esto ya no es necesario porque React dejó de usar el pooling de eventos. Pero si guardas la referencia al valor que necesitas antes de cualquier operación asíncrona, tu código será compatible con cualquier versión:

Conclusión

Tipar eventos en React con TypeScript es sencillo una vez que conoces los tipos disponibles. Los más comunes son ChangeEvent, FormEvent y MouseEvent. Y si tienes dudas sobre qué tipo usar, SyntheticEvent siempre funciona como fallback genérico.

Abrazo. bliss.

Enlaces relacionados

meta cover

Cómo añadir Cloudflare Turnstile a tus formularios con React Router Framework

Checa este otro Post

meta cover

5 Razones para preferir componentes de tipo función

Checa este otro Post

¡Nuevo curso!

Animaciones web con React + Motion 🧙🏻