Closed kitten closed 3 weeks ago
Latest commit: c25848cea63f7729e9e37ae7c082c6dfe2bc30ea
The changes in this PR will be included in the next version bump.
Not sure what this means? Click here to learn what changesets are.
Click here if you're a maintainer who wants to add another changeset to this PR
Summary
Patterns that require a
T | {}
optionality being merged into selections are causing exponential complexity. This is because all fields in a selection are merged using theobj
utility. However,T | {}
causes2^n
complexity in evaluating and flattening types in TypeScript.This is because for each
A & (B | {})
merge two variants are created,(A & B) | (A & {})
. For each subsequent addition (e.g.A & (B | {}) & (C | {})
) the complexity doubles ((A & B) | (A & C) | (A & B & C) | A
. This can quickly cause a recursion complexity error in TypeScript once we reach the limit of 16 variants.This fix addresses this by limiting the flattening of fields to just the fields and not optional sub-selections.
This fix however does have a few problems:
getPossibleTypeSelectionRec
just slightly too hard to follow for my tasteAs such, post-merge, we're not planning to release this fix as another stable release straightaway and are still looking for improvements.
Set of changes