isSortable type guards use "any" in return type
Author: evercoyoteCreated Sep 3, 2026Updated Sep 3, 2026
I'm working in a build environment that's fairly strict about our use of any.
I've found that the isSortable() type guard isn't very helpful in that environment because all it guarantees is SortableDraggable<any> | SortableDroppable<any>. We need something that can return SortableDraggable<T> | SortableDroppable<T> where T is a known subtype of Data.
For now, I've created alternate versions of isSortable() and isSortableOperation() that do this. I'm wondering if you'd consider integrating our changes into dnd-kit?
import { Data, Draggable, DragOperation, Droppable } from "@dnd-kit/abstract";
import { SortableDraggable, SortableDroppable } from "@dnd-kit/dom/sortable";
export function isSortable<T extends Data = Data>(
element: Draggable<T> | null,
): element is SortableDraggable<T>;
export function isSortable<T extends Data = Data>(
element: Droppable<T> | null,
): element is SortableDroppable<T>;
export function isSortable<T extends Data = Data>(
element: Draggable<T> | Droppable<T> | null,
): element is SortableDroppable<T> | SortableDraggable<T> {
return element instanceof SortableDroppable || element instanceof SortableDraggable;
}
export function isSortableOperation<T extends Data = Data>(
operation: DragOperation<Draggable<T>, Droppable<T>>,
): operation is DragOperation<SortableDraggable<T>, SortableDroppable<T>> {
return isSortable(operation.source) && isSortable(operation.target);
}Source: clauderic/dnd-kit