Создание пользовательского события в JavaScript

Вопрос о создании кастомного события

При разработке на JavaScript я столкнулся с трудностью в определении аргументов, передаваемых между функциями. Поэтому я решил создать простой объект для описания события и его параметров.

var GreetingEvent = {
    GREETING: 'greeting',
    'params': {
        username: null
    }
}

// отправка события
this.triggerEvent(new CustomEvent(GreetingEvent.GREETING, "имя_пользователя"));

// подписка на событие
this.onEvent(GreetingEvent.GREETING, this.handleGreeting);

Не так давно я обновил код:

// отправка
this.triggerEvent('greeting', {username: 'имя_пользователя'});

// подписка
this.onEvent('greeting', this.handleGreeting);

Главный вопрос заключается в том, что моим коллегам нужно изучать код или использовать console.log для выяснения, какие параметры передаются в их обработчики. Кто-нибудь имел аналогичные проблемы? Как вы их решали?

Почему бы не валидировать прямо в обработчиках событий? Я делаю простую проверку if (!event.username) throw new Error('username required') — сразу видно что передавать. Можно еще дефолты добавить через деструктуризацию {username = 'anonymous'} = event. Не будет ли это избыточно для твоих задач?

Сталкивался с этим. Мы делаем enum’ы для всех кастомных событий в отдельном модуле, в комментах описываем структуру данных. Договорились именовать события через константы вроде EVENT_USER_LOGIN. Еще можно создать фабрику событий с методами EventFactory.createGreeting(username) — сразу видно что передавать. Документацию никто не читает, лучше когда код говорит сам за себя.

У нас была похожая ситуация в команде пару лет назад. Мы начали использовать JSDoc для описания структуры событий – это действительно помогло. Просто добавьте комменты к функциям с тем, что они принимают, и какие поля ожидает объект. Можно также создать отдельный файл с константами для событий и описать всё в комментариях там. TypeScript идеально решает эту проблему с интерфейсами, но понимаю, что не всегда можно его подключить к проекту.