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]ifSis related toT.Tis related to a type{ [P in keyof T]: X }ifT[P]is related toX.{ [P in keyof T]: X }is related to a typeTifXis 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 ofTwhereXis 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 forKto directly or indirectly referenceT.Twith a constraint that includes a string index signature of typeX, the apparent type of an indexed access typeT[K]isX.Fixes #12311.
Fixes #12315.