Skip to content

Commit e1895c2

Browse files
authored
Merge pull request #392 from zjffun/issue-382
Support set the callback function type according to the event type.
2 parents 9fb4657 + 5ed92b9 commit e1895c2

File tree

1 file changed

+99
-13
lines changed

1 file changed

+99
-13
lines changed

index.d.ts

Lines changed: 99 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,66 @@ declare module '@shopify/draggable' {
2424

2525
export { AbstractEvent as BaseEvent };
2626

27+
type GetEventByEventName<eventName> = eventName extends 'draggable:initialize'
28+
? DraggableInitializedEvent
29+
: eventName extends 'draggable:destroy'
30+
? DraggableDestroyEvent
31+
: eventName extends 'drag:start'
32+
? DragStartEvent
33+
: eventName extends 'drag:move'
34+
? DragMoveEvent
35+
: eventName extends 'drag:over'
36+
? DragOverEvent
37+
: eventName extends 'drag:over:container'
38+
? DragOverContainerEvent
39+
: eventName extends 'drag:out'
40+
? DragOutEvent
41+
: eventName extends 'drag:out:container'
42+
? DragOutContainerEvent
43+
: eventName extends 'drag:stop'
44+
? DragStopEvent
45+
: eventName extends 'drag:pressure'
46+
? DragPressureEvent
47+
: eventName extends 'mirror:create'
48+
? MirrorCreateEvent
49+
: eventName extends 'mirror:created'
50+
? MirrorCreatedEvent
51+
: eventName extends 'mirror:attached'
52+
? MirrorAttachedEvent
53+
: eventName extends 'mirror:move'
54+
? MirrorMoveEvent
55+
: eventName extends 'mirror:destroy'
56+
? MirrorDestroyEvent
57+
: eventName extends 'droppable:dropped'
58+
? DroppableDroppedEvent
59+
: eventName extends 'droppable:returned'
60+
? DroppableReturnedEvent
61+
: eventName extends 'sortable:start'
62+
? SortableStartEvent
63+
: eventName extends 'sortable:sort'
64+
? SortableSortEvent
65+
: eventName extends 'sortable:sorted'
66+
? SortableSortedEvent
67+
: eventName extends 'sortable:stop'
68+
? SortableStopEvent
69+
: eventName extends 'swappable:start'
70+
? SwappableStartEvent
71+
: eventName extends 'swappable:swap'
72+
? SwappableSwapEvent
73+
: eventName extends 'swappable:swapped'
74+
? SwappableSwappedEvent
75+
: eventName extends 'swappable:stop'
76+
? SwappableStopEvent
77+
: eventName extends 'collidable:in'
78+
? CollidableInEvent
79+
: eventName extends 'collidable:out'
80+
? CollidableOutEvent
81+
: eventName extends 'snap:in'
82+
? SnapInEvent
83+
: eventName extends 'snap:out'
84+
? SnapOutEvent
85+
: AbstractEvent;
86+
2787
/**
2888
* DragEvent
2989
*/
@@ -77,7 +137,8 @@ declare module '@shopify/draggable' {
77137
'drag:out' |
78138
'drag:out:container' |
79139
'drag:stop' |
80-
'drag:pressure';
140+
'drag:pressure' |
141+
MirrorEventNames;
81142

82143
export class DraggableEvent extends AbstractEvent {
83144
readonly draggable: Draggable;
@@ -113,7 +174,7 @@ declare module '@shopify/draggable' {
113174
swapAnimation?: SwapAnimationOptions;
114175
}
115176

116-
export class Draggable<EventListType extends string = DraggableEventNames | MirrorEventNames> {
177+
export class Draggable<EventListType = DraggableEventNames> {
117178
static Plugins: {
118179
Announcement: typeof Announcement,
119180
Focusable: typeof Focusable,
@@ -122,8 +183,8 @@ declare module '@shopify/draggable' {
122183
};
123184
constructor(containers: DraggableContainer, options?: DraggableOptions);
124185
destroy(): void;
125-
on(eventName: EventListType, callback: (event: AbstractEvent) => void): this;
126-
off(eventName: EventListType, callback: (event: AbstractEvent) => void): this;
186+
on<T extends EventListType>(eventName: T, callback: (event: GetEventByEventName<T>) => void): this;
187+
off<T extends EventListType>(eventName: T, callback: (event: GetEventByEventName<T>) => void): this;
127188
trigger(event: typeof AbstractEvent): void;
128189
addPlugin(...plugins: Array<typeof AbstractPlugin>): this;
129190
removePlugin(...plugins: Array<typeof AbstractPlugin>): this;
@@ -278,7 +339,8 @@ declare module '@shopify/draggable' {
278339
*/
279340
export type DroppableEventNames =
280341
'droppable:dropped' |
281-
'droppable:returned';
342+
'droppable:returned' |
343+
DraggableEventNames;
282344

283345
export class DroppableEvent extends AbstractEvent {
284346
readonly dragEvent: DragEvent;
@@ -310,7 +372,7 @@ declare module '@shopify/draggable' {
310372
classes?: { [key in DroppableClassNames]: string };
311373
}
312374

313-
export class Droppable extends Draggable<DraggableEventNames | DroppableEventNames | MirrorEventNames> {
375+
export class Droppable<T = DroppableEventNames> extends Draggable<T> {
314376
constructor(containers: DraggableContainer, options: DroppableOptions);
315377
getClassNameFor(name: DroppableClassNames): string;
316378
}
@@ -322,7 +384,8 @@ declare module '@shopify/draggable' {
322384
'sortable:start' |
323385
'sortable:sort' |
324386
'sortable:sorted' |
325-
'sortable:stop';
387+
'sortable:stop' |
388+
DraggableEventNames;
326389

327390
export class SortableEvent extends AbstractEvent {
328391
readonly dragEvent: DragEvent;
@@ -354,7 +417,7 @@ declare module '@shopify/draggable' {
354417
readonly newContainer: HTMLElement;
355418
}
356419

357-
export class Sortable extends Draggable<DraggableEventNames | MirrorEventNames | SortableEventNames> { }
420+
export class Sortable<T = SortableEventNames> extends Draggable<T> { }
358421

359422
/**
360423
* Swappable
@@ -363,7 +426,8 @@ declare module '@shopify/draggable' {
363426
'swappable:start' |
364427
'swappable:swap' |
365428
'swappable:swapped' |
366-
'swappable:stop';
429+
'swappable:stop' |
430+
DraggableEventNames;
367431

368432
export class SwappableEvent extends AbstractEvent {
369433
readonly dragEvent: DragEvent;
@@ -382,11 +446,22 @@ declare module '@shopify/draggable' {
382446

383447
export class SwappableStopEvent extends SwappableEvent { }
384448

385-
export class Swappable extends Draggable<DraggableEventNames | MirrorEventNames | SwappableEventNames> { }
449+
export class Swappable<T = SwappableEventNames> extends Draggable<T> { }
386450

387451
/**
388452
* Collidable Plugin
389453
*/
454+
export type CollidableEventNames =
455+
'collidable:in' |
456+
'collidable:out';
457+
458+
export class CollidableEvent extends AbstractEvent {
459+
readonly dragEvent: DragEvent;
460+
readonly collidingElement: HTMLElement;
461+
}
462+
export class CollidableInEvent extends CollidableEvent { }
463+
export class CollidableOutEvent extends CollidableEvent { }
464+
390465
export type Collidables = string | NodeList | HTMLElement[] | (() => NodeList | HTMLElement[]);
391466

392467
class Collidable extends AbstractPlugin {
@@ -395,23 +470,34 @@ declare module '@shopify/draggable' {
395470
}
396471

397472
/**
398-
* ResizeMirror
473+
* ResizeMirror Plugin
399474
*/
400475
class ResizeMirror extends AbstractPlugin {
401476
protected attach(): void;
402477
protected detach(): void;
403478
}
404479

405480
/**
406-
* Snappable
481+
* Snappable Plugin
407482
*/
483+
export type SnappableEventNames =
484+
'snap:in' |
485+
'snap:out';
486+
487+
export class SnapEvent extends AbstractEvent {
488+
readonly dragEvent: DragEvent;
489+
readonly snappable: HTMLElement;
490+
}
491+
export class SnapInEvent extends SnapEvent { }
492+
export class SnapOutEvent extends SnapEvent { }
493+
408494
class Snappable extends AbstractPlugin {
409495
protected attach(): void;
410496
protected detach(): void;
411497
}
412498

413499
/**
414-
* SwapAnimation
500+
* SwapAnimation Plugin
415501
*/
416502
export interface SwapAnimationOptions {
417503
duration: number;

0 commit comments

Comments
 (0)