@@ -9875,7 +9875,7 @@ namespace ts {
9875
9875
return false;
9876
9876
}
9877
9877
9878
- function getPropertyTypeForIndexType(objectType: Type, indexType: Type, accessNode: ElementAccessExpression | IndexedAccessTypeNode | PropertyName | BindingName | SyntheticExpression | undefined, cacheSymbol: boolean, missingType: Type) {
9878
+ function getPropertyTypeForIndexType(originalObjectType: Type, objectType: Type, indexType: Type, accessNode: ElementAccessExpression | IndexedAccessTypeNode | PropertyName | BindingName | SyntheticExpression | undefined, cacheSymbol: boolean, missingType: Type) {
9879
9879
const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? accessNode : undefined;
9880
9880
const propName = isTypeUsableAsPropertyName(indexType) ?
9881
9881
getPropertyNameFromType(indexType) :
@@ -9898,7 +9898,6 @@ namespace ts {
9898
9898
getNodeLinks(accessNode!).resolvedSymbol = prop;
9899
9899
}
9900
9900
}
9901
-
9902
9901
const propType = getTypeOfSymbol(prop);
9903
9902
return accessExpression && getAssignmentTargetKind(accessExpression) !== AssignmentKind.Definite ?
9904
9903
getFlowTypeOfReference(accessExpression, propType) :
@@ -9922,7 +9921,8 @@ namespace ts {
9922
9921
if (objectType.flags & (TypeFlags.Any | TypeFlags.Never)) {
9923
9922
return objectType;
9924
9923
}
9925
- const indexInfo = isTypeAssignableToKind(indexType, TypeFlags.NumberLike) && getIndexInfoOfType(objectType, IndexKind.Number) ||
9924
+ const indexInfo = accessExpression && isAssignmentTarget(accessExpression) && isGenericObjectType(originalObjectType) ? undefined :
9925
+ isTypeAssignableToKind(indexType, TypeFlags.NumberLike) && getIndexInfoOfType(objectType, IndexKind.Number) ||
9926
9926
getIndexInfoOfType(objectType, IndexKind.String) ||
9927
9927
undefined;
9928
9928
if (indexInfo) {
@@ -10105,7 +10105,7 @@ namespace ts {
10105
10105
const propTypes: Type[] = [];
10106
10106
let wasMissingProp = false;
10107
10107
for (const t of (<UnionType>indexType).types) {
10108
- const propType = getPropertyTypeForIndexType(apparentObjectType, t, accessNode, /*cacheSymbol*/ false, missingType);
10108
+ const propType = getPropertyTypeForIndexType(objectType, apparentObjectType, t, accessNode, /*cacheSymbol*/ false, missingType);
10109
10109
if (propType === missingType) {
10110
10110
if (!accessNode) {
10111
10111
// If there's no error node, we can immeditely stop, since error reporting is off
@@ -10121,9 +10121,9 @@ namespace ts {
10121
10121
if (wasMissingProp) {
10122
10122
return missingType;
10123
10123
}
10124
- return getUnionType(propTypes);
10124
+ return !accessNode || getAssignmentTargetKind(accessNode) === AssignmentKind.None ? getUnionType(propTypes) : getIntersectionType (propTypes);
10125
10125
}
10126
- return getPropertyTypeForIndexType(apparentObjectType, indexType, accessNode, /*cacheSymbol*/ true, missingType);
10126
+ return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, accessNode, /*cacheSymbol*/ true, missingType);
10127
10127
}
10128
10128
10129
10129
function getTypeFromIndexedAccessTypeNode(node: IndexedAccessTypeNode) {
@@ -19570,7 +19570,7 @@ namespace ts {
19570
19570
markAliasReferenced(parentSymbol, node);
19571
19571
}
19572
19572
if (!prop) {
19573
- const indexInfo = getIndexInfoOfType(apparentType, IndexKind.String);
19573
+ const indexInfo = assignmentKind === AssignmentKind.None || !isGenericObjectType(leftType) ? getIndexInfoOfType(apparentType, IndexKind.String) : undefined ;
19574
19574
if (!(indexInfo && indexInfo.type)) {
19575
19575
if (isJSLiteralType(leftType)) {
19576
19576
return anyType;
0 commit comments