@types/react 19.2.8 → 19.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
react/README.md CHANGED
@@ -8,7 +8,7 @@ This package contains type definitions for react (https://react.dev/).
8
8
  Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react.
9
9
 
10
10
  ### Additional Details
11
- * Last updated: Sat, 10 Jan 2026 09:35:12 GMT
11
+ * Last updated: Tue, 27 Jan 2026 12:02:23 GMT
12
12
  * Dependencies: [csstype](https://npmjs.com/package/csstype)
13
13
 
14
14
  # Credits
react/canary.d.ts CHANGED
@@ -71,19 +71,19 @@ declare module "." {
71
71
  /**
72
72
  * The `<ViewTransition>` or its parent Component is mounted and there's no other `<ViewTransition>` with the same name being deleted.
73
73
  */
74
- onEnter?: (instance: ViewTransitionInstance, types: Array<string>) => void;
74
+ onEnter?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
75
75
  /**
76
76
  * The `<ViewTransition>` or its parent Component is unmounted and there's no other `<ViewTransition>` with the same name being deleted.
77
77
  */
78
- onExit?: (instance: ViewTransitionInstance, types: Array<string>) => void;
78
+ onExit?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
79
79
  /**
80
80
  * This `<ViewTransition>` is being mounted and another `<ViewTransition>` instance with the same name is being unmounted elsewhere.
81
81
  */
82
- onShare?: (instance: ViewTransitionInstance, types: Array<string>) => void;
82
+ onShare?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
83
83
  /**
84
84
  * The content of `<ViewTransition>` has changed either due to DOM mutations or because an inner child `<ViewTransition>` has resized.
85
85
  */
86
- onUpdate?: (instance: ViewTransitionInstance, types: Array<string>) => void;
86
+ onUpdate?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
87
87
  ref?: Ref<ViewTransitionInstance> | undefined;
88
88
  /**
89
89
  * Combined with {@link className} if this `<ViewTransition>` is being mounted and another instance with the same name is being unmounted elsewhere.
react/experimental.d.ts CHANGED
@@ -129,6 +129,9 @@ declare module "." {
129
129
  rangeStart?: number | undefined;
130
130
  rangeEnd?: number | undefined;
131
131
  }
132
+ export type GestureOptionsRequired = {
133
+ [P in keyof GestureOptions]-?: NonNullable<GestureOptions[P]>;
134
+ };
132
135
  /** */
133
136
  export function unstable_startGestureTransition(
134
137
  provider: GestureProvider,
@@ -136,6 +139,33 @@ declare module "." {
136
139
  options?: GestureOptions,
137
140
  ): () => void;
138
141
 
142
+ interface ViewTransitionProps {
143
+ onGestureEnter?: (
144
+ timeline: GestureProvider,
145
+ options: GestureOptionsRequired,
146
+ instance: ViewTransitionInstance,
147
+ types: Array<string>,
148
+ ) => void | (() => void);
149
+ onGestureExit?: (
150
+ timeline: GestureProvider,
151
+ options: GestureOptionsRequired,
152
+ instance: ViewTransitionInstance,
153
+ types: Array<string>,
154
+ ) => void | (() => void);
155
+ onGestureShare?: (
156
+ timeline: GestureProvider,
157
+ options: GestureOptionsRequired,
158
+ instance: ViewTransitionInstance,
159
+ types: Array<string>,
160
+ ) => void | (() => void);
161
+ onGestureUpdate?: (
162
+ timeline: GestureProvider,
163
+ options: GestureOptionsRequired,
164
+ instance: ViewTransitionInstance,
165
+ types: Array<string>,
166
+ ) => void | (() => void);
167
+ }
168
+
139
169
  // @enableSrcObject
140
170
  interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES {
141
171
  srcObject: Blob;
react/global.d.ts CHANGED
@@ -18,6 +18,7 @@ interface KeyboardEvent extends Event {}
18
18
  interface MouseEvent extends Event {}
19
19
  interface TouchEvent extends Event {}
20
20
  interface PointerEvent extends Event {}
21
+ interface SubmitEvent extends Event {}
21
22
  interface ToggleEvent extends Event {}
22
23
  interface TransitionEvent extends Event {}
23
24
  interface UIEvent extends Event {}
react/index.d.ts CHANGED
@@ -16,6 +16,7 @@ type NativeKeyboardEvent = KeyboardEvent;
16
16
  type NativeMouseEvent = MouseEvent;
17
17
  type NativeTouchEvent = TouchEvent;
18
18
  type NativePointerEvent = PointerEvent;
19
+ type NativeSubmitEvent = SubmitEvent;
19
20
  type NativeToggleEvent = ToggleEvent;
20
21
  type NativeTransitionEvent = TransitionEvent;
21
22
  type NativeUIEvent = UIEvent;
@@ -2065,15 +2066,28 @@ declare namespace React {
2065
2066
  target: EventTarget & Target;
2066
2067
  }
2067
2068
 
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
+ */
2068
2074
  interface FormEvent<T = Element> extends SyntheticEvent<T> {
2069
2075
  }
2070
2076
 
2071
2077
  interface InvalidEvent<T = Element> extends SyntheticEvent<T> {
2072
- target: EventTarget & T;
2073
2078
  }
2074
2079
 
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;
2077
2091
  }
2078
2092
 
2079
2093
  interface InputEvent<T = Element> extends SyntheticEvent<T, NativeInputEvent> {
@@ -2143,6 +2157,13 @@ declare namespace React {
2143
2157
  shiftKey: boolean;
2144
2158
  }
2145
2159
 
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
+
2146
2167
  interface TouchEvent<T = Element> extends UIEvent<T, NativeTouchEvent> {
2147
2168
  altKey: boolean;
2148
2169
  changedTouches: TouchList;
@@ -2198,11 +2219,19 @@ declare namespace React {
2198
2219
  type CompositionEventHandler<T = Element> = EventHandler<CompositionEvent<T>>;
2199
2220
  type DragEventHandler<T = Element> = EventHandler<DragEvent<T>>;
2200
2221
  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
+ */
2201
2227
  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
+ >;
2203
2231
  type InputEventHandler<T = Element> = EventHandler<InputEvent<T>>;
2204
2232
  type KeyboardEventHandler<T = Element> = EventHandler<KeyboardEvent<T>>;
2205
2233
  type MouseEventHandler<T = Element> = EventHandler<MouseEvent<T>>;
2234
+ type SubmitEventHandler<T = Element> = EventHandler<SubmitEvent<T>>;
2206
2235
  type TouchEventHandler<T = Element> = EventHandler<TouchEvent<T>>;
2207
2236
  type PointerEventHandler<T = Element> = EventHandler<PointerEvent<T>>;
2208
2237
  type UIEventHandler<T = Element> = EventHandler<UIEvent<T>>;
@@ -2256,19 +2285,19 @@ declare namespace React {
2256
2285
  onBlur?: FocusEventHandler<T> | undefined;
2257
2286
  onBlurCapture?: FocusEventHandler<T> | undefined;
2258
2287
 
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;
2262
2291
  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;
2272
2301
 
2273
2302
  // Image Events
2274
2303
  onLoad?: ReactEventHandler<T> | undefined;
@@ -3275,7 +3304,9 @@ declare namespace React {
3275
3304
  value?: string | readonly string[] | number | undefined;
3276
3305
  width?: number | string | undefined;
3277
3306
 
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;
3279
3310
  }
3280
3311
 
3281
3312
  interface KeygenHTMLAttributes<T> extends HTMLAttributes<T> {
@@ -3440,7 +3471,9 @@ declare namespace React {
3440
3471
  required?: boolean | undefined;
3441
3472
  size?: number | undefined;
3442
3473
  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;
3444
3477
  }
3445
3478
 
3446
3479
  interface SourceHTMLAttributes<T> extends HTMLAttributes<T> {
@@ -3492,7 +3525,9 @@ declare namespace React {
3492
3525
  value?: string | readonly string[] | number | undefined;
3493
3526
  wrap?: string | undefined;
3494
3527
 
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;
3496
3531
  }
3497
3532
 
3498
3533
  interface TdHTMLAttributes<T> extends HTMLAttributes<T> {
react/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@types/react",
3
- "version": "19.2.8",
3
+ "version": "19.2.10",
4
4
  "description": "TypeScript definitions for react",
5
5
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react",
6
6
  "license": "MIT",
@@ -205,6 +205,6 @@
205
205
  "csstype": "^3.2.2"
206
206
  },
207
207
  "peerDependencies": {},
208
- "typesPublisherContentHash": "c9838d545f1709345a21b6b6fc58e0d5fde2af0c005deed9b55bcb60b2373b33",
208
+ "typesPublisherContentHash": "c1bacedf82d12682fbaf19b2e74fd83bbeea9f1592d6885e013c8c1379ce22e8",
209
209
  "typeScriptVersion": "5.2"
210
210
  }
react/ts5.0/canary.d.ts CHANGED
@@ -71,19 +71,19 @@ declare module "." {
71
71
  /**
72
72
  * The `<ViewTransition>` or its parent Component is mounted and there's no other `<ViewTransition>` with the same name being deleted.
73
73
  */
74
- onEnter?: (instance: ViewTransitionInstance, types: Array<string>) => void;
74
+ onEnter?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
75
75
  /**
76
76
  * The `<ViewTransition>` or its parent Component is unmounted and there's no other `<ViewTransition>` with the same name being deleted.
77
77
  */
78
- onExit?: (instance: ViewTransitionInstance, types: Array<string>) => void;
78
+ onExit?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
79
79
  /**
80
80
  * This `<ViewTransition>` is being mounted and another `<ViewTransition>` instance with the same name is being unmounted elsewhere.
81
81
  */
82
- onShare?: (instance: ViewTransitionInstance, types: Array<string>) => void;
82
+ onShare?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
83
83
  /**
84
84
  * The content of `<ViewTransition>` has changed either due to DOM mutations or because an inner child `<ViewTransition>` has resized.
85
85
  */
86
- onUpdate?: (instance: ViewTransitionInstance, types: Array<string>) => void;
86
+ onUpdate?: (instance: ViewTransitionInstance, types: Array<string>) => void | (() => void);
87
87
  ref?: Ref<ViewTransitionInstance> | undefined;
88
88
  /**
89
89
  * Combined with {@link className} if this `<ViewTransition>` is being mounted and another instance with the same name is being unmounted elsewhere.
@@ -129,6 +129,9 @@ declare module "." {
129
129
  rangeStart?: number | undefined;
130
130
  rangeEnd?: number | undefined;
131
131
  }
132
+ export type GestureOptionsRequired = {
133
+ [P in keyof GestureOptions]-?: NonNullable<GestureOptions[P]>;
134
+ };
132
135
  /** */
133
136
  export function unstable_startGestureTransition(
134
137
  provider: GestureProvider,
@@ -136,6 +139,33 @@ declare module "." {
136
139
  options?: GestureOptions,
137
140
  ): () => void;
138
141
 
142
+ interface ViewTransitionProps {
143
+ onGestureEnter?: (
144
+ timeline: GestureProvider,
145
+ options: GestureOptionsRequired,
146
+ instance: ViewTransitionInstance,
147
+ types: Array<string>,
148
+ ) => void | (() => void);
149
+ onGestureExit?: (
150
+ timeline: GestureProvider,
151
+ options: GestureOptionsRequired,
152
+ instance: ViewTransitionInstance,
153
+ types: Array<string>,
154
+ ) => void | (() => void);
155
+ onGestureShare?: (
156
+ timeline: GestureProvider,
157
+ options: GestureOptionsRequired,
158
+ instance: ViewTransitionInstance,
159
+ types: Array<string>,
160
+ ) => void | (() => void);
161
+ onGestureUpdate?: (
162
+ timeline: GestureProvider,
163
+ options: GestureOptionsRequired,
164
+ instance: ViewTransitionInstance,
165
+ types: Array<string>,
166
+ ) => void | (() => void);
167
+ }
168
+
139
169
  // @enableSrcObject
140
170
  interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES {
141
171
  srcObject: Blob;
react/ts5.0/global.d.ts CHANGED
@@ -18,6 +18,7 @@ interface KeyboardEvent extends Event {}
18
18
  interface MouseEvent extends Event {}
19
19
  interface TouchEvent extends Event {}
20
20
  interface PointerEvent extends Event {}
21
+ interface SubmitEvent extends Event {}
21
22
  interface ToggleEvent extends Event {}
22
23
  interface TransitionEvent extends Event {}
23
24
  interface UIEvent extends Event {}
react/ts5.0/index.d.ts CHANGED
@@ -16,6 +16,7 @@ type NativeKeyboardEvent = KeyboardEvent;
16
16
  type NativeMouseEvent = MouseEvent;
17
17
  type NativeTouchEvent = TouchEvent;
18
18
  type NativePointerEvent = PointerEvent;
19
+ type NativeSubmitEvent = SubmitEvent;
19
20
  type NativeToggleEvent = ToggleEvent;
20
21
  type NativeTransitionEvent = TransitionEvent;
21
22
  type NativeUIEvent = UIEvent;
@@ -2064,15 +2065,28 @@ declare namespace React {
2064
2065
  target: EventTarget & Target;
2065
2066
  }
2066
2067
 
2068
+ /**
2069
+ * @deprecated FormEvent doesn't actually exist.
2070
+ * You probably meant to use {@link ChangeEvent}, {@link InputEvent}, {@link SubmitEvent}, or just {@link SyntheticEvent} instead
2071
+ * depending on the event type.
2072
+ */
2067
2073
  interface FormEvent<T = Element> extends SyntheticEvent<T> {
2068
2074
  }
2069
2075
 
2070
2076
  interface InvalidEvent<T = Element> extends SyntheticEvent<T> {
2071
- target: EventTarget & T;
2072
2077
  }
2073
2078
 
2074
- interface ChangeEvent<T = Element> extends SyntheticEvent<T> {
2075
- target: EventTarget & T;
2079
+ /**
2080
+ * change events bubble in React so their target is generally unknown.
2081
+ * Only for form elements we know their target type because form events can't
2082
+ * be nested.
2083
+ * This type exists purely to narrow `target` for form elements. It doesn't
2084
+ * reflect a DOM event. React fires change events as {@link SyntheticEvent}.
2085
+ */
2086
+ interface ChangeEvent<CurrentTarget = Element, Target = Element> extends SyntheticEvent<CurrentTarget> {
2087
+ // TODO: This is wrong for change event handlers on arbitrary. Should
2088
+ // be EventTarget & Target, but kept for backward compatibility until React 20.
2089
+ target: EventTarget & CurrentTarget;
2076
2090
  }
2077
2091
 
2078
2092
  interface InputEvent<T = Element> extends SyntheticEvent<T, NativeInputEvent> {
@@ -2142,6 +2156,13 @@ declare namespace React {
2142
2156
  shiftKey: boolean;
2143
2157
  }
2144
2158
 
2159
+ interface SubmitEvent<T = Element> extends SyntheticEvent<T, NativeSubmitEvent> {
2160
+ // Currently not exposed by Reat
2161
+ // submitter: HTMLElement | null;
2162
+ // SubmitEvents are always targetted at HTMLFormElements.
2163
+ target: EventTarget & HTMLFormElement;
2164
+ }
2165
+
2145
2166
  interface TouchEvent<T = Element> extends UIEvent<T, NativeTouchEvent> {
2146
2167
  altKey: boolean;
2147
2168
  changedTouches: TouchList;
@@ -2197,11 +2218,19 @@ declare namespace React {
2197
2218
  type CompositionEventHandler<T = Element> = EventHandler<CompositionEvent<T>>;
2198
2219
  type DragEventHandler<T = Element> = EventHandler<DragEvent<T>>;
2199
2220
  type FocusEventHandler<T = Element> = EventHandler<FocusEvent<T>>;
2221
+ /**
2222
+ * @deprecated FormEventHandler doesn't actually exist.
2223
+ * You probably meant to use {@link ChangeEventHandler}, {@link InputEventHandler}, {@link SubmitEventHandler}, or just {@link EventHandler} instead
2224
+ * depending on the event type.
2225
+ */
2200
2226
  type FormEventHandler<T = Element> = EventHandler<FormEvent<T>>;
2201
- type ChangeEventHandler<T = Element> = EventHandler<ChangeEvent<T>>;
2227
+ type ChangeEventHandler<CurrentTarget = Element, Target = Element> = EventHandler<
2228
+ ChangeEvent<CurrentTarget, Target>
2229
+ >;
2202
2230
  type InputEventHandler<T = Element> = EventHandler<InputEvent<T>>;
2203
2231
  type KeyboardEventHandler<T = Element> = EventHandler<KeyboardEvent<T>>;
2204
2232
  type MouseEventHandler<T = Element> = EventHandler<MouseEvent<T>>;
2233
+ type SubmitEventHandler<T = Element> = EventHandler<SubmitEvent<T>>;
2205
2234
  type TouchEventHandler<T = Element> = EventHandler<TouchEvent<T>>;
2206
2235
  type PointerEventHandler<T = Element> = EventHandler<PointerEvent<T>>;
2207
2236
  type UIEventHandler<T = Element> = EventHandler<UIEvent<T>>;
@@ -2255,19 +2284,19 @@ declare namespace React {
2255
2284
  onBlur?: FocusEventHandler<T> | undefined;
2256
2285
  onBlurCapture?: FocusEventHandler<T> | undefined;
2257
2286
 
2258
- // Form Events
2259
- onChange?: FormEventHandler<T> | undefined;
2260
- onChangeCapture?: FormEventHandler<T> | undefined;
2287
+ // form related Events
2288
+ onChange?: ChangeEventHandler<T> | undefined;
2289
+ onChangeCapture?: ChangeEventHandler<T> | undefined;
2261
2290
  onBeforeInput?: InputEventHandler<T> | undefined;
2262
- onBeforeInputCapture?: FormEventHandler<T> | undefined;
2263
- onInput?: FormEventHandler<T> | undefined;
2264
- onInputCapture?: FormEventHandler<T> | undefined;
2265
- onReset?: FormEventHandler<T> | undefined;
2266
- onResetCapture?: FormEventHandler<T> | undefined;
2267
- onSubmit?: FormEventHandler<T> | undefined;
2268
- onSubmitCapture?: FormEventHandler<T> | undefined;
2269
- onInvalid?: FormEventHandler<T> | undefined;
2270
- onInvalidCapture?: FormEventHandler<T> | undefined;
2291
+ onBeforeInputCapture?: InputEventHandler<T> | undefined;
2292
+ onInput?: InputEventHandler<T> | undefined;
2293
+ onInputCapture?: InputEventHandler<T> | undefined;
2294
+ onReset?: ReactEventHandler<T> | undefined;
2295
+ onResetCapture?: ReactEventHandler<T> | undefined;
2296
+ onSubmit?: SubmitEventHandler<T> | undefined;
2297
+ onSubmitCapture?: SubmitEventHandler<T> | undefined;
2298
+ onInvalid?: ReactEventHandler<T> | undefined;
2299
+ onInvalidCapture?: ReactEventHandler<T> | undefined;
2271
2300
 
2272
2301
  // Image Events
2273
2302
  onLoad?: ReactEventHandler<T> | undefined;
@@ -3274,7 +3303,9 @@ declare namespace React {
3274
3303
  value?: string | readonly string[] | number | undefined;
3275
3304
  width?: number | string | undefined;
3276
3305
 
3277
- onChange?: ChangeEventHandler<T> | undefined;
3306
+ // No other element dispatching change events can be nested in a <input>
3307
+ // so we know the target will be a HTMLInputElement.
3308
+ onChange?: ChangeEventHandler<T, HTMLInputElement> | undefined;
3278
3309
  }
3279
3310
 
3280
3311
  interface KeygenHTMLAttributes<T> extends HTMLAttributes<T> {
@@ -3439,7 +3470,9 @@ declare namespace React {
3439
3470
  required?: boolean | undefined;
3440
3471
  size?: number | undefined;
3441
3472
  value?: string | readonly string[] | number | undefined;
3442
- onChange?: ChangeEventHandler<T> | undefined;
3473
+ // No other element dispatching change events can be nested in a <select>
3474
+ // so we know the target will be a HTMLSelectElement.
3475
+ onChange?: ChangeEventHandler<T, HTMLSelectElement> | undefined;
3443
3476
  }
3444
3477
 
3445
3478
  interface SourceHTMLAttributes<T> extends HTMLAttributes<T> {
@@ -3491,7 +3524,9 @@ declare namespace React {
3491
3524
  value?: string | readonly string[] | number | undefined;
3492
3525
  wrap?: string | undefined;
3493
3526
 
3494
- onChange?: ChangeEventHandler<T> | undefined;
3527
+ // No other element dispatching change events can be nested in a <textarea>
3528
+ // so we know the target will be a HTMLTextAreaElement.
3529
+ onChange?: ChangeEventHandler<T, HTMLTextAreaElement> | undefined;
3495
3530
  }
3496
3531
 
3497
3532
  interface TdHTMLAttributes<T> extends HTMLAttributes<T> {