microsoft / microsoft/TypeScript
an emitter with 239 events breaks type check, throw ts2590 Expression produces a union type that is too complex to represent
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
Bug Report
I wrote a framework (namely koishi) which uses a fully-typed event emitter implemented by itself. However when I create more events (totally 239), the type check just broke with an error ts2590 (Expression produces a union type that is too complex to represent). It seems that the error was thrown here:

I know 239 events is a lot, but I still cannot figure out how the 239 events became "100000 type checks".
Can you help prevent this error either by optimize type check performance or by improve my code? Thanks.
🔎 Search Terms
union type, interface, event emitter, ts2590
🕗 Version & Regression Information
I tried with v4.1.3, v4.1.5 & v4.2.1-rc. They all failed.
⏯ Playground Link
This playground will not work because it imports a dependency @octokit/webhooks-definitions (it's just a simple collection of github webhooks type definitions, but it is too big (over 5000 lines) to be included as I thought).
Playground link with a dependency
And the dependency code can be found here: https://unpkg.com/@octokit/webhooks-definitions@3.60.0/schema.d.ts
💻 Code
interface EventMap extends SessionEventMap, WebhookEventMap {}
declare function on<K extends keyof EventMap>(name: K, listener: EventMap[K]): () => boolean
on('message', () => {})
🙁 Actual behavior
TS2590 error: Expression produces a union type that is too complex to represent.
🙂 Expected behavior
No compiler error
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked Playground and the minimal EventMap/on example, then inspect the referenced @octokit/webhooks-definitions schema.d.ts dependency to reproduce TS2590 with roughly 239 events. Compare the reported TypeScript versions and confirm that the example type-checks without the union-complexity error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100