@@ -16,6 +16,7 @@ type NativeKeyboardEvent = KeyboardEvent;
1616type NativeMouseEvent = MouseEvent ;
1717type NativeTouchEvent = TouchEvent ;
1818type NativePointerEvent = PointerEvent ;
19+ type NativeSubmitEvent = SubmitEvent ;
1920type NativeToggleEvent = ToggleEvent ;
2021type NativeTransitionEvent = TransitionEvent ;
2122type NativeUIEvent = UIEvent ;
@@ -2065,15 +2066,28 @@ declare namespace React {
20652066 target : EventTarget & Target ;
20662067 }
20672068
2069+ /**
2070+ * @deprecated FormEvent doesn't actually exist.
2071+ * You probably meant to use {@link ChangeEvent}, {@link InputEvent}, {@link SubmitEvent}, or just {@link SyntheticEvent} instead
2072+ * depending on the event type.
2073+ */
20682074 interface FormEvent < T = Element > extends SyntheticEvent < T > {
20692075 }
20702076
20712077 interface InvalidEvent < T = Element > extends SyntheticEvent < T > {
2072- target : EventTarget & T ;
20732078 }
20742079
2075- interface ChangeEvent < T = Element > extends SyntheticEvent < T > {
2076- target : EventTarget & T ;
2080+ /**
2081+ * change events bubble in React so their target is generally unknown.
2082+ * Only for form elements we know their target type because form events can't
2083+ * be nested.
2084+ * This type exists purely to narrow `target` for form elements. It doesn't
2085+ * reflect a DOM event. Change events are just fired as standard {@link SyntheticEvent}.
2086+ */
2087+ interface ChangeEvent < CurrentTarget = Element , Target = Element > extends SyntheticEvent < CurrentTarget > {
2088+ // TODO: This is wrong for change event handlers on arbitrary. Should
2089+ // be EventTarget & Target, but kept for backward compatibility until React 20.
2090+ target : EventTarget & CurrentTarget ;
20772091 }
20782092
20792093 interface InputEvent < T = Element > extends SyntheticEvent < T , NativeInputEvent > {
@@ -2143,6 +2157,13 @@ declare namespace React {
21432157 shiftKey : boolean ;
21442158 }
21452159
2160+ interface SubmitEvent < T = Element > extends SyntheticEvent < T , NativeSubmitEvent > {
2161+ // Currently not exposed by Reat
2162+ // submitter: HTMLElement | null;
2163+ // SubmitEvents are always targetted at HTMLFormElements.
2164+ target : EventTarget & HTMLFormElement ;
2165+ }
2166+
21462167 interface TouchEvent < T = Element > extends UIEvent < T , NativeTouchEvent > {
21472168 altKey : boolean ;
21482169 changedTouches : TouchList ;
@@ -2198,11 +2219,19 @@ declare namespace React {
21982219 type CompositionEventHandler < T = Element > = EventHandler < CompositionEvent < T > > ;
21992220 type DragEventHandler < T = Element > = EventHandler < DragEvent < T > > ;
22002221 type FocusEventHandler < T = Element > = EventHandler < FocusEvent < T > > ;
2222+ /**
2223+ * @deprecated FormEventHandler doesn't actually exist.
2224+ * You probably meant to use {@link ChangeEventHandler}, {@link InputEventHandler}, {@link SubmitEventHandler}, or just {@link EventHandler} instead
2225+ * depending on the event type.
2226+ */
22012227 type FormEventHandler < T = Element > = EventHandler < FormEvent < T > > ;
2202- type ChangeEventHandler < T = Element > = EventHandler < ChangeEvent < T > > ;
2228+ type ChangeEventHandler < CurrentTarget = Element , Target = Element > = EventHandler <
2229+ ChangeEvent < CurrentTarget , Target >
2230+ > ;
22032231 type InputEventHandler < T = Element > = EventHandler < InputEvent < T > > ;
22042232 type KeyboardEventHandler < T = Element > = EventHandler < KeyboardEvent < T > > ;
22052233 type MouseEventHandler < T = Element > = EventHandler < MouseEvent < T > > ;
2234+ type SubmitEventHandler < T = Element > = EventHandler < SubmitEvent < T > > ;
22062235 type TouchEventHandler < T = Element > = EventHandler < TouchEvent < T > > ;
22072236 type PointerEventHandler < T = Element > = EventHandler < PointerEvent < T > > ;
22082237 type UIEventHandler < T = Element > = EventHandler < UIEvent < T > > ;
@@ -2256,19 +2285,19 @@ declare namespace React {
22562285 onBlur ?: FocusEventHandler < T > | undefined ;
22572286 onBlurCapture ?: FocusEventHandler < T > | undefined ;
22582287
2259- // Form Events
2260- onChange ?: FormEventHandler < T > | undefined ;
2261- onChangeCapture ?: FormEventHandler < T > | undefined ;
2288+ // form related Events
2289+ onChange ?: ChangeEventHandler < T > | undefined ;
2290+ onChangeCapture ?: ChangeEventHandler < T > | undefined ;
22622291 onBeforeInput ?: InputEventHandler < T > | undefined ;
2263- onBeforeInputCapture ?: FormEventHandler < T > | undefined ;
2264- onInput ?: FormEventHandler < T > | undefined ;
2265- onInputCapture ?: FormEventHandler < T > | undefined ;
2266- onReset ?: FormEventHandler < T > | undefined ;
2267- onResetCapture ?: FormEventHandler < T > | undefined ;
2268- onSubmit ?: FormEventHandler < T > | undefined ;
2269- onSubmitCapture ?: FormEventHandler < T > | undefined ;
2270- onInvalid ?: FormEventHandler < T > | undefined ;
2271- onInvalidCapture ?: FormEventHandler < T > | undefined ;
2292+ onBeforeInputCapture ?: InputEventHandler < T > | undefined ;
2293+ onInput ?: InputEventHandler < T > | undefined ;
2294+ onInputCapture ?: InputEventHandler < T > | undefined ;
2295+ onReset ?: ReactEventHandler < T > | undefined ;
2296+ onResetCapture ?: ReactEventHandler < T > | undefined ;
2297+ onSubmit ?: SubmitEventHandler < T > | undefined ;
2298+ onSubmitCapture ?: SubmitEventHandler < T > | undefined ;
2299+ onInvalid ?: ReactEventHandler < T > | undefined ;
2300+ onInvalidCapture ?: ReactEventHandler < T > | undefined ;
22722301
22732302 // Image Events
22742303 onLoad ?: ReactEventHandler < T > | undefined ;
@@ -3275,7 +3304,9 @@ declare namespace React {
32753304 value ?: string | readonly string [ ] | number | undefined ;
32763305 width ?: number | string | undefined ;
32773306
3278- onChange ?: ChangeEventHandler < T > | undefined ;
3307+ // No other element dispatching change events can be nested in a <input>
3308+ // so we know the target will be a HTMLInputElement.
3309+ onChange ?: ChangeEventHandler < T , HTMLInputElement > | undefined ;
32793310 }
32803311
32813312 interface KeygenHTMLAttributes < T > extends HTMLAttributes < T > {
@@ -3440,7 +3471,9 @@ declare namespace React {
34403471 required ?: boolean | undefined ;
34413472 size ?: number | undefined ;
34423473 value ?: string | readonly string [ ] | number | undefined ;
3443- onChange ?: ChangeEventHandler < T > | undefined ;
3474+ // No other element dispatching change events can be nested in a <select>
3475+ // so we know the target will be a HTMLSelectElement.
3476+ onChange ?: ChangeEventHandler < T , HTMLSelectElement > | undefined ;
34443477 }
34453478
34463479 interface SourceHTMLAttributes < T > extends HTMLAttributes < T > {
@@ -3492,7 +3525,9 @@ declare namespace React {
34923525 value ?: string | readonly string [ ] | number | undefined ;
34933526 wrap ?: string | undefined ;
34943527
3495- onChange ?: ChangeEventHandler < T > | undefined ;
3528+ // No other element dispatching change events can be nested in a <textare>
3529+ // so we know the target will be a HTMLTextAreaElement.
3530+ onChange ?: ChangeEventHandler < T , HTMLTextAreaElement > | undefined ;
34963531 }
34973532
34983533 interface TdHTMLAttributes < T > extends HTMLAttributes < T > {
0 commit comments