MCPcopy Index your code
hub / github.com/nodejs/node / resolveMappedTypeMembers

Function resolveMappedTypeMembers

test/fixtures/snapshot/typescript.js:58537–58606  ·  view source on GitHub ↗

Resolve the members of a mapped type { [P in K]: T }

(type)

Source from the content-addressed store, hash-verified

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);

Callers 1

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…