Great prompt! And awesome to see someone else using TypeScript!
After dabbling with many game engines and frameworks, I highly prefer using the workflow of using a framework (like love2d or raylib) over an engine (like godot or unity). I find engines often make simple things much harder than they need to be. Using TypeScript gives me the type-safety and language server features I enjoy. I find that the built in web APIs for things like 2d rendering on context, input handling, sound, etc, all feel really similar to using a game framework .
I've been using this TypeScript, <canvas>, and built in web APIs approach for lots of projects (games and otherwise) lately, so I was able to reuse lots of knowledge for this game jam. However, for this game jam I wanted to experiment with the idea of using a "fat entity struct" which people from the handmade community recommend! This means that I have a large fixed array of entities where an entity has all the fields anything in my game could ever need. It ended up looking like this: https://github.com/onsclom/silly-jam/blob/main/src/state.ts#L5. This was a big change compared to how I would represent entities before, but I ended up really liking this approach. It helped us move really fast, removed a lot of potential code duplication, and various things I worried about (like performance) never became an issue!


