Messages with matching data
Apps announce events: "lesson done" with a lesson id, "level up" with a level number. A typed event bus makes sure every event name comes with the right data — on both the sending and receiving side.
An event map
type Events = {
lessonDone: { id: string };
levelUp: { level: number };
};
function emit<K extends keyof Events>(name: K, data: Events[K]) {
console.log(name, data);
}
emit("levelUp", { level: 3 });
emit("levelUp", { id: "d01" });
emit("badge", {});