Как нормально перегрузить функцию?
К сожалению, в TypeScript придётся проверять через if.
function dispatch<T>(key: DispatchKey<T>, value: DispatchValue<T>): void;
function dispatch<T>(keys: DispatchKey<T>[], iterator: (key: DispatchKey<T>) => DispatchValue<T>): void;
function dispatch<T>(
    keyOrKeys: DispatchKey<T> | DispatchKey<T>[],
    valueOrIterator: DispatchValue<T> | ((key: DispatchKey<T>) => DispatchValue<T>)
): void {
    if (Array.isArray(keyOrKeys) && typeof valueOrIterator === 'function') {
        setState((prev) => {
            const updated = keyOrKeys.map((key) => valueOrIterator(key));
            console.log(updated);
            return prev;
        });
    } else {
        setState((prev) => ({
            ...prev,
            [keyOrKeys]: valueOrIterator,
        }));
    }
}
В таком случае проще вовсе разные функции сделать чем заниматься такой ерундой с проверками типов, это даже перегрузкой не назовешь