@@ -4532,7 +4532,7 @@ namespace ts {
4532
4532
const isomorphicProp = isomorphicType && getPropertyOfType(isomorphicType, propName);
4533
4533
const isOptional = templateOptional || !!(isomorphicProp && isomorphicProp.flags & SymbolFlags.Optional);
4534
4534
const prop = <TransientSymbol>createSymbol(SymbolFlags.Property | SymbolFlags.Transient | (isOptional ? SymbolFlags.Optional : 0), propName);
4535
- prop.type = addOptionality( propType, isOptional) ;
4535
+ prop.type = propType;
4536
4536
prop.isReadonly = templateReadonly || isomorphicProp && isReadonlySymbol(isomorphicProp);
4537
4537
members[propName] = prop;
4538
4538
}
@@ -4556,7 +4556,7 @@ namespace ts {
4556
4556
function getTemplateTypeFromMappedType(type: MappedType) {
4557
4557
return type.templateType ||
4558
4558
(type.templateType = type.declaration.type ?
4559
- instantiateType(getTypeFromTypeNode(type.declaration.type), type.mapper || identityMapper) :
4559
+ instantiateType(addOptionality( getTypeFromTypeNode(type.declaration.type), !!type.declaration.questionToken ), type.mapper || identityMapper) :
4560
4560
unknownType);
4561
4561
}
4562
4562
@@ -6021,7 +6021,7 @@ namespace ts {
6021
6021
}
6022
6022
const mapper = createUnaryTypeMapper(getTypeParameterFromMappedType(type), indexType);
6023
6023
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, mapper) : mapper;
6024
- return addOptionality( instantiateType(getTemplateTypeFromMappedType(type), templateMapper), !!type.declaration.questionToken );
6024
+ return instantiateType(getTemplateTypeFromMappedType(type), templateMapper);
6025
6025
}
6026
6026
6027
6027
function getIndexedAccessType(objectType: Type, indexType: Type, accessNode?: ElementAccessExpression | IndexedAccessTypeNode) {
@@ -8484,16 +8484,18 @@ namespace ts {
8484
8484
const typeInferences = createTypeInferencesObject();
8485
8485
const typeInferencesArray = [typeInferences];
8486
8486
const templateType = getTemplateTypeFromMappedType(target);
8487
+ const readonlyMask = target.declaration.readonlyToken ? false : true;
8488
+ const optionalMask = target.declaration.questionToken ? 0 : SymbolFlags.Optional;
8487
8489
const properties = getPropertiesOfType(source);
8488
8490
const members = createSymbolTable(properties);
8489
8491
let hasInferredTypes = false;
8490
8492
for (const prop of properties) {
8491
8493
const inferredPropType = inferTargetType(getTypeOfSymbol(prop));
8492
8494
if (inferredPropType) {
8493
- const inferredProp = <TransientSymbol>createSymbol(SymbolFlags.Property | SymbolFlags.Transient | prop.flags & SymbolFlags.Optional , prop.name);
8495
+ const inferredProp = <TransientSymbol>createSymbol(SymbolFlags.Property | SymbolFlags.Transient | prop.flags & optionalMask , prop.name);
8494
8496
inferredProp.declarations = prop.declarations;
8495
8497
inferredProp.type = inferredPropType;
8496
- inferredProp.isReadonly = isReadonlySymbol(prop);
8498
+ inferredProp.isReadonly = readonlyMask && isReadonlySymbol(prop);
8497
8499
members[prop.name] = inferredProp;
8498
8500
hasInferredTypes = true;
8499
8501
}
@@ -8502,7 +8504,7 @@ namespace ts {
8502
8504
if (indexInfo) {
8503
8505
const inferredIndexType = inferTargetType(indexInfo.type);
8504
8506
if (inferredIndexType) {
8505
- indexInfo = createIndexInfo(inferredIndexType, indexInfo.isReadonly);
8507
+ indexInfo = createIndexInfo(inferredIndexType, readonlyMask && indexInfo.isReadonly);
8506
8508
hasInferredTypes = true;
8507
8509
}
8508
8510
}
0 commit comments