Skip to content

Commit 1464097

Browse files
[material-ui] Corrected generic type definition in SelectChangeEvent (#45941)
1 parent 0ff1989 commit 1464097

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

packages/mui-material/src/Select/Select.spec.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as React from 'react';
22
import Select, { SelectChangeEvent, SelectProps } from '@mui/material/Select';
33
import MenuItem from '@mui/material/MenuItem';
44
import { createTheme } from '@mui/material/styles';
5+
import { expectType } from '@mui/types';
56

67
function genericValueTest() {
78
function handleChangeWithSameTypeAsSelect(event: SelectChangeEvent<number>) {}
@@ -199,3 +200,25 @@ const AppSelect = <T extends string>(props: Props<T>) => {
199200

200201
// test for applying Select's static muiName property type to wrapper components
201202
AppSelect.muiName = Select.muiName;
203+
204+
<Select<'option1' | 'option2'>
205+
value="option1"
206+
onChange={(event) => {
207+
expectType<'option1' | 'option2', typeof event.target.value>(event.target.value);
208+
}}
209+
>
210+
<MenuItem value="option1" />
211+
{/* Whoops. The value in onChange won't be a string */}
212+
<MenuItem value="option2" />
213+
</Select>;
214+
215+
<Select<number | ''>
216+
value={1}
217+
onChange={(event) => {
218+
expectType<number | '', typeof event.target.value>(event.target.value);
219+
}}
220+
>
221+
<MenuItem value={1} />
222+
{/* Whoops. The value in onChange won't be a string */}
223+
<MenuItem value={2} />
224+
</Select>;

packages/mui-material/src/Select/SelectInput.d.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ import { MenuProps } from '../Menu';
88
* The type of event depends on what caused the change.
99
* For example, when the browser auto-fills the `Select` you'll receive a `React.ChangeEvent`.
1010
*/
11-
export type SelectChangeEvent<Value = string> =
12-
| (Event & { target: { value: Value; name: string } })
13-
| React.ChangeEvent<HTMLInputElement>;
11+
12+
export type SelectChangeEvent<Value = string> = Value extends (string & {}) | number
13+
?
14+
| React.ChangeEvent<Omit<HTMLInputElement, 'value'> & { value: Value }>
15+
| (Event & { target: { value: Value; name: string } })
16+
: React.ChangeEvent<HTMLInputElement> | (Event & { target: { value: Value; name: string } });
1417

1518
export interface SelectInputProps<Value = unknown> {
1619
autoFocus?: boolean;

0 commit comments

Comments
 (0)