Skip to content

Commit eef909d

Browse files
authored
Merge pull request #179 from codegouvfr/fix/select-next-targets-type
fix wrong type on target / currentTarget on SelectNext
2 parents 8908ced + 202bdcf commit eef909d

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/SelectNext.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,24 @@ export type SelectProps<Options extends SelectProps.Option[]> = {
3434
value?: Options[number]["value"];
3535
onChange?: (
3636
e: Omit<ChangeEvent<HTMLSelectElement>, "target" | "currentTarget"> & {
37-
target: Omit<ChangeEvent<HTMLSelectElement>, "value"> & {
37+
target: Omit<EventTarget & HTMLSelectElement, "value" | "selectedOptions"> & {
3838
value: Options[number]["value"];
39+
selectedOptions: HTMLCollectionOf<
40+
Omit<HTMLOptionElement, "value"> & {
41+
value: Options[number]["value"];
42+
}
43+
>;
3944
};
40-
currentTarget: Omit<ChangeEvent<HTMLSelectElement>, "value"> & {
45+
currentTarget: Omit<
46+
EventTarget & HTMLSelectElement,
47+
"value" | "selectedOptions"
48+
> & {
4149
value: Options[number]["value"];
50+
selectedOptions: HTMLCollectionOf<
51+
Omit<HTMLOptionElement, "value"> & {
52+
value: Options[number]["value"];
53+
}
54+
>;
4255
};
4356
}
4457
) => void;

test/types/Select.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,37 @@ import { assert, type Equals } from "tsafe";
262262
}}
263263
/>;
264264
}
265+
266+
{
267+
const dogOrCatOptions = [
268+
{
269+
value: "dog",
270+
label: "Dog"
271+
},
272+
{
273+
value: "cat",
274+
label: "Cat"
275+
}
276+
] as const;
277+
278+
type DogOrCat = typeof dogOrCatOptions[number]["value"];
279+
type SelectTarget = Omit<EventTarget & HTMLSelectElement, "value" | "selectedOptions"> & {
280+
value: DogOrCat;
281+
selectedOptions: HTMLCollectionOf<Omit<HTMLOptionElement, "value"> & { value: DogOrCat }>;
282+
};
283+
<Select
284+
label="Dog or cat person?"
285+
options={[...dogOrCatOptions]}
286+
placeholder="Select an option"
287+
nativeSelectProps={{
288+
"onChange": event => {
289+
assert<Equals<typeof event["currentTarget"], SelectTarget>>();
290+
assert<Equals<typeof event["target"], SelectTarget>>();
291+
const selectedValues = Array.from(event.target.selectedOptions).map(
292+
option => option.value
293+
);
294+
assert<Equals<typeof selectedValues, DogOrCat[]>>;
295+
}
296+
}}
297+
/>;
298+
}

0 commit comments

Comments
 (0)