const dataReq = { ...req.params, ...req.query } as IRequestMonth;
Почитай об юнионах в тс - не совсем понятно, какую роль это играет здесь.
direction
может иметь всего 2 значения, а ты прописал, что может иметь любую строку.direction?: 'up' | 'down'
В event loop жса 3 отдельных call stack'a (насчёт первых двух очень не уверен, что всё верно распишу).
Первый стак ─ это стак с интерпритацией кода, который читает код и кладёт комманды в основной стак.
Второй стак (основной) ─ это стак, откуда берутся задачи для выполнения.
Третий стак ─ это стак для таймаутов, интервалов и, по моему, чего-то ещё. И этот стак кладёт задачи в конец основного стака по триггеру.
Так вот, когда браузер читает хтмл и доходит до первого блока жса, он останавливается, в основной стак добавляются задачи, но т.к. все задачи в примере выше синхронные, то каллбек промиса выполняется сразу же после объявления промиса, как и then, из-за синхронности каллбека (то есть интерпритатор прошёлся по всему коду, добавил в основной стек создание промиса и выполнение синхронной функции, синхронная функция синхронно вызвала резолв, что сразу же добавило в основной стак другую синхронную функци с консол логом, которая сразу же и отработала). А пока основной стак содержит задачи, хтмл далее не читается и в основной стак не попадает задача с консол логом из второго скрипт блока.
В то же время пример с таймаутом кладёт задачу в другой стак, который не мешает продолжить читать хтмл (даже если поставить таймер на 0, т.к. минимальное время срабатывания 4 мс) и в итоге в основной стак попадает консол лог ДО того, как сработает таймаут и вызовет резолв.
В деталях мог сильно наложать, но в логике происходящего я уверен.