Isomorphic mapped types and unions #12447
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
A mapped type of the form
{ [P in keyof T]: X }
, whereT
is some type parameter, is said to be an isomorphic mapped type because it produces a type with the same shape asT
. With this PR we make instantiations of isomorphic mapped types distributive over union types. For example, when{ [P in keyof T]: X }
is instantiated withA | B
forT
, we produce{ [P in keyof A]: X } | { [P in keyof B]: X }
. Furthermore, when a primitive type is substituted forT
in an isomorphic mapped type, we simply produce that primitive type. For example, when{ [P in keyof T]: X }
is instantiated withA | undefined
forT
, we produce{ [P in keyof A]: X } | undefined
.This PR also includes a minor fix that makes any isomorphic mapped type assignable to an empty object type.