#2132·dnd-kit

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?

typescript
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);
}