(type)
| 58455 | return instantiateType(instantiable, createTypeMapper([type.indexType, type.objectType], [getNumberLiteralType(0), createTupleType([replacement])])); |
| 58456 | } |
| 58457 | function resolveReverseMappedTypeMembers(type) { |
| 58458 | var indexInfo = getIndexInfoOfType(type.source, stringType); |
| 58459 | var modifiers = getMappedTypeModifiers(type.mappedType); |
| 58460 | var readonlyMask = modifiers & 1 /* MappedTypeModifiers.IncludeReadonly */ ? false : true; |
| 58461 | var optionalMask = modifiers & 4 /* MappedTypeModifiers.IncludeOptional */ ? 0 : 16777216 /* SymbolFlags.Optional */; |
| 58462 | var indexInfos = indexInfo ? [createIndexInfo(stringType, inferReverseMappedType(indexInfo.type, type.mappedType, type.constraintType), readonlyMask && indexInfo.isReadonly)] : ts.emptyArray; |
| 58463 | var members = ts.createSymbolTable(); |
| 58464 | for (var _i = 0, _a = getPropertiesOfType(type.source); _i < _a.length; _i++) { |
| 58465 | var prop = _a[_i]; |
| 58466 | var checkFlags = 8192 /* CheckFlags.ReverseMapped */ | (readonlyMask && isReadonlySymbol(prop) ? 8 /* CheckFlags.Readonly */ : 0); |
| 58467 | var inferredProp = createSymbol(4 /* SymbolFlags.Property */ | prop.flags & optionalMask, prop.escapedName, checkFlags); |
| 58468 | inferredProp.declarations = prop.declarations; |
| 58469 | inferredProp.nameType = getSymbolLinks(prop).nameType; |
| 58470 | inferredProp.propertyType = getTypeOfSymbol(prop); |
| 58471 | if (type.constraintType.type.flags & 8388608 /* TypeFlags.IndexedAccess */ |
| 58472 | && type.constraintType.type.objectType.flags & 262144 /* TypeFlags.TypeParameter */ |
| 58473 | && type.constraintType.type.indexType.flags & 262144 /* TypeFlags.TypeParameter */) { |
| 58474 | // A reverse mapping of `{[K in keyof T[K_1]]: T[K_1]}` is the same as that of `{[K in keyof T]: T}`, since all we care about is |
| 58475 | // inferring to the "type parameter" (or indexed access) shared by the constraint and template. So, to reduce the number of |
| 58476 | // type identities produced, we simplify such indexed access occurences |
| 58477 | var newTypeParam = type.constraintType.type.objectType; |
| 58478 | var newMappedType = replaceIndexedAccess(type.mappedType, type.constraintType.type, newTypeParam); |
| 58479 | inferredProp.mappedType = newMappedType; |
| 58480 | inferredProp.constraintType = getIndexType(newTypeParam); |
| 58481 | } |
| 58482 | else { |
| 58483 | inferredProp.mappedType = type.mappedType; |
| 58484 | inferredProp.constraintType = type.constraintType; |
| 58485 | } |
| 58486 | members.set(prop.escapedName, inferredProp); |
| 58487 | } |
| 58488 | setStructuredTypeMembers(type, members, ts.emptyArray, ts.emptyArray, indexInfos); |
| 58489 | } |
| 58490 | // Return the lower bound of the key type in a mapped type. Intuitively, the lower |
| 58491 | // bound includes those keys that are known to always be present, for example because |
| 58492 | // because of constraints on type parameters (e.g. 'keyof T' for a constrained T). |
no test coverage detected