Higher order type relations for mapped types #12351
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.
This PR adds a number of type relations for higher order mapped types and indexed access types (i.e. un-instantiated generic forms of the types).
S[K]
is related to a typeT[K]
ifS
is related toT
.T
is related to a type{ [P in keyof T]: X }
ifT[P]
is related toX
.{ [P in keyof T]: X }
is related to a typeT
ifX
is related toT[P]
.The PR furthermore adds the following rules:
keyof { [P in K]: X }
is equivalent to justK
. For example,keyof Partial<T>
is equivalent tokeyof T
.{ [P in K]: T}[X]
is equivalent to an instantiation ofT
whereX
is substituted for every occurrence ofP
. For example,{ [P in K]: Box<T[P]> }[X]
is equivalent toBox<T[X]>
.type T = { [P in K]: X }
it is an error forK
to directly or indirectly referenceT
.T
with a constraint that includes a string index signature of typeX
, the apparent type of an indexed access typeT[K]
isX
.Fixes #12311.
Fixes #12315.