Skip to content

Commit 3618771

Browse files
authored
fix: Incorrect onToggle event type (#4615)
* fix: Incorrect onToggle event type * refactor: Backport ToggleEvent
1 parent 3972db1 commit 3618771

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

src/jsx.d.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,28 @@ type Defaultize<Props, Defaults> =
2020

2121
type Booleanish = boolean | 'true' | 'false';
2222

23+
// Remove when bumping TS minimum to >5.2
24+
25+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ToggleEvent) */
26+
interface ToggleEvent extends Event {
27+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ToggleEvent/newState) */
28+
readonly newState: string;
29+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ToggleEvent/oldState) */
30+
readonly oldState: string;
31+
}
32+
33+
declare var ToggleEvent: {
34+
prototype: ToggleEvent;
35+
new(type: string, eventInitDict?: ToggleEventInit): ToggleEvent;
36+
};
37+
38+
interface ToggleEventInit extends EventInit {
39+
newState?: string;
40+
oldState?: string;
41+
}
42+
43+
// End TS >5.2
44+
2345
export namespace JSXInternal {
2446
export type LibraryManagedAttributes<Component, Props> = Component extends {
2547
defaultProps: infer Defaults;
@@ -508,6 +530,10 @@ export namespace JSXInternal {
508530
Target,
509531
TouchEvent
510532
>;
533+
export type TargetedToggleEvent<Target extends EventTarget> = TargetedEvent<
534+
Target,
535+
ToggleEvent
536+
>;
511537
export type TargetedTransitionEvent<Target extends EventTarget> =
512538
TargetedEvent<Target, TransitionEvent>;
513539
export type TargetedUIEvent<Target extends EventTarget> = TargetedEvent<
@@ -536,6 +562,9 @@ export namespace JSXInternal {
536562
export type DragEventHandler<Target extends EventTarget> = EventHandler<
537563
TargetedDragEvent<Target>
538564
>;
565+
export type ToggleEventHandler<Target extends EventTarget> = EventHandler<
566+
TargetedToggleEvent<Target>
567+
>;
539568
export type FocusEventHandler<Target extends EventTarget> = EventHandler<
540569
TargetedFocusEvent<Target>
541570
>;
@@ -597,7 +626,7 @@ export namespace JSXInternal {
597626
onCompositionUpdateCapture?: CompositionEventHandler<Target> | undefined;
598627

599628
// Details Events
600-
onToggle?: GenericEventHandler<Target> | undefined;
629+
onToggle?: ToggleEventHandler<Target> | undefined;
601630

602631
// Dialog Events
603632
onClose?: GenericEventHandler<Target> | undefined;

test/ts/preact.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,10 @@ const acceptsStringAsLength = <div style={{ marginTop: '20px' }} />;
351351

352352
const ReturnNull: FunctionalComponent = () => null;
353353

354+
// Should accept arbitrary properties outside of JSX.HTMLAttributes
355+
h('option', { x: 'foo' });
356+
createElement('option', { value: 'foo' });
357+
354358
// Refs should work on elements
355359
const ref = createRef<HTMLDivElement>();
356360
createElement('div', { ref: ref }, 'hi');
@@ -375,13 +379,17 @@ const onBeforeInput = (e: h.JSX.TargetedInputEvent<HTMLInputElement>) => {};
375379
createElement('input', { onBeforeInput: onBeforeInput });
376380
h('input', { onBeforeInput: onBeforeInput });
377381

382+
// Should accept onSubmit
378383
const onSubmit = (e: h.JSX.TargetedSubmitEvent<HTMLFormElement>) => {};
379384
<form onSubmit={e => e.currentTarget.elements} />;
380385
createElement('form', { onSubmit: onSubmit });
381386
h('form', { onSubmit: onSubmit });
382387

383-
h('option', { value: 'foo' });
384-
createElement('option', { value: 'foo' });
388+
// Should accept onToggle
389+
const onToggle = (e: h.JSX.TargetedToggleEvent<HTMLDetailsElement>) => {};
390+
<dialog onToggle={(e) => ({ newState: e.newState, oldState: e.oldState }) } />;
391+
createElement('dialog', { onToggle: onToggle });
392+
h('dialog', { onToggle: onToggle });
385393

386394
// Should default to correct event target element for the attribute interface
387395
h<JSX.InputHTMLAttributes>('input', { onClick: e => e.currentTarget.capture });

0 commit comments

Comments
 (0)