Resolve the members of a mapped type { [P in K]: T }
(type)
| 58535 | } |
| 58536 | /** Resolve the members of a mapped type { [P in K]: T } */ |
| 58537 | function resolveMappedTypeMembers(type) { |
| 58538 | var members = ts.createSymbolTable(); |
| 58539 | var indexInfos; |
| 58540 | // Resolve upfront such that recursive references see an empty object type. |
| 58541 | setStructuredTypeMembers(type, emptySymbols, ts.emptyArray, ts.emptyArray, ts.emptyArray); |
| 58542 | // In { [P in K]: T }, we refer to P as the type parameter type, K as the constraint type, |
| 58543 | // and T as the template type. |
| 58544 | var typeParameter = getTypeParameterFromMappedType(type); |
| 58545 | var constraintType = getConstraintTypeFromMappedType(type); |
| 58546 | var nameType = getNameTypeFromMappedType(type.target || type); |
| 58547 | var templateType = getTemplateTypeFromMappedType(type.target || type); |
| 58548 | var modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); // The 'T' in 'keyof T' |
| 58549 | var templateModifiers = getMappedTypeModifiers(type); |
| 58550 | var include = keyofStringsOnly ? 128 /* TypeFlags.StringLiteral */ : 8576 /* TypeFlags.StringOrNumberLiteralOrUnique */; |
| 58551 | if (isMappedTypeWithKeyofConstraintDeclaration(type)) { |
| 58552 | // We have a { [P in keyof T]: X } |
| 58553 | forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(modifiersType, include, keyofStringsOnly, addMemberForKeyType); |
| 58554 | } |
| 58555 | else { |
| 58556 | forEachType(getLowerBoundOfKeyType(constraintType), addMemberForKeyType); |
| 58557 | } |
| 58558 | setStructuredTypeMembers(type, members, ts.emptyArray, ts.emptyArray, indexInfos || ts.emptyArray); |
| 58559 | function addMemberForKeyType(keyType) { |
| 58560 | var propNameType = nameType ? instantiateType(nameType, appendTypeMapping(type.mapper, typeParameter, keyType)) : keyType; |
| 58561 | forEachType(propNameType, function (t) { return addMemberForKeyTypeWorker(keyType, t); }); |
| 58562 | } |
| 58563 | function addMemberForKeyTypeWorker(keyType, propNameType) { |
| 58564 | // If the current iteration type constituent is a string literal type, create a property. |
| 58565 | // Otherwise, for type string create a string index signature. |
| 58566 | if (isTypeUsableAsPropertyName(propNameType)) { |
| 58567 | var propName = getPropertyNameFromType(propNameType); |
| 58568 | // String enum members from separate enums with identical values |
| 58569 | // are distinct types with the same property name. Make the resulting |
| 58570 | // property symbol's name type be the union of those enum member types. |
| 58571 | var existingProp = members.get(propName); |
| 58572 | if (existingProp) { |
| 58573 | existingProp.nameType = getUnionType([existingProp.nameType, propNameType]); |
| 58574 | existingProp.keyType = getUnionType([existingProp.keyType, keyType]); |
| 58575 | } |
| 58576 | else { |
| 58577 | var modifiersProp = isTypeUsableAsPropertyName(keyType) ? getPropertyOfType(modifiersType, getPropertyNameFromType(keyType)) : undefined; |
| 58578 | var isOptional = !!(templateModifiers & 4 /* MappedTypeModifiers.IncludeOptional */ || |
| 58579 | !(templateModifiers & 8 /* MappedTypeModifiers.ExcludeOptional */) && modifiersProp && modifiersProp.flags & 16777216 /* SymbolFlags.Optional */); |
| 58580 | var isReadonly = !!(templateModifiers & 1 /* MappedTypeModifiers.IncludeReadonly */ || |
| 58581 | !(templateModifiers & 2 /* MappedTypeModifiers.ExcludeReadonly */) && modifiersProp && isReadonlySymbol(modifiersProp)); |
| 58582 | var stripOptional = strictNullChecks && !isOptional && modifiersProp && modifiersProp.flags & 16777216 /* SymbolFlags.Optional */; |
| 58583 | var lateFlag = modifiersProp ? getIsLateCheckFlag(modifiersProp) : 0; |
| 58584 | var prop = createSymbol(4 /* SymbolFlags.Property */ | (isOptional ? 16777216 /* SymbolFlags.Optional */ : 0), propName, lateFlag | 262144 /* CheckFlags.Mapped */ | (isReadonly ? 8 /* CheckFlags.Readonly */ : 0) | (stripOptional ? 524288 /* CheckFlags.StripOptional */ : 0)); |
| 58585 | prop.mappedType = type; |
| 58586 | prop.nameType = propNameType; |
| 58587 | prop.keyType = keyType; |
| 58588 | if (modifiersProp) { |
| 58589 | prop.syntheticOrigin = modifiersProp; |
| 58590 | // If the mapped type has an `as XXX` clause, the property name likely won't match the declaration name and |
| 58591 | // multiple properties may map to the same name. Thus, we attach no declarations to the symbol. |
| 58592 | prop.declarations = nameType ? undefined : modifiersProp.declarations; |
| 58593 | } |
| 58594 | members.set(propName, prop); |
no test coverage detected
searching dependent graphs…