Skip to content

Commit 5de3ee8

Browse files
committed
getIndexedAccessType for assignment target uses intersections
1 parent fc95dc4 commit 5de3ee8

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9875,7 +9875,7 @@ namespace ts {
98759875
return false;
98769876
}
98779877

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) {
98799879
const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? accessNode : undefined;
98809880
const propName = isTypeUsableAsPropertyName(indexType) ?
98819881
getPropertyNameFromType(indexType) :
@@ -9898,7 +9898,6 @@ namespace ts {
98989898
getNodeLinks(accessNode!).resolvedSymbol = prop;
98999899
}
99009900
}
9901-
99029901
const propType = getTypeOfSymbol(prop);
99039902
return accessExpression && getAssignmentTargetKind(accessExpression) !== AssignmentKind.Definite ?
99049903
getFlowTypeOfReference(accessExpression, propType) :
@@ -9922,7 +9921,8 @@ namespace ts {
99229921
if (objectType.flags & (TypeFlags.Any | TypeFlags.Never)) {
99239922
return objectType;
99249923
}
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) ||
99269926
getIndexInfoOfType(objectType, IndexKind.String) ||
99279927
undefined;
99289928
if (indexInfo) {
@@ -10105,7 +10105,7 @@ namespace ts {
1010510105
const propTypes: Type[] = [];
1010610106
let wasMissingProp = false;
1010710107
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);
1010910109
if (propType === missingType) {
1011010110
if (!accessNode) {
1011110111
// If there's no error node, we can immeditely stop, since error reporting is off
@@ -10121,9 +10121,9 @@ namespace ts {
1012110121
if (wasMissingProp) {
1012210122
return missingType;
1012310123
}
10124-
return getUnionType(propTypes);
10124+
return !accessNode || getAssignmentTargetKind(accessNode) === AssignmentKind.None ? getUnionType(propTypes) : getIntersectionType(propTypes);
1012510125
}
10126-
return getPropertyTypeForIndexType(apparentObjectType, indexType, accessNode, /*cacheSymbol*/ true, missingType);
10126+
return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, accessNode, /*cacheSymbol*/ true, missingType);
1012710127
}
1012810128

1012910129
function getTypeFromIndexedAccessTypeNode(node: IndexedAccessTypeNode) {
@@ -19570,7 +19570,7 @@ namespace ts {
1957019570
markAliasReferenced(parentSymbol, node);
1957119571
}
1957219572
if (!prop) {
19573-
const indexInfo = getIndexInfoOfType(apparentType, IndexKind.String);
19573+
const indexInfo = assignmentKind === AssignmentKind.None || !isGenericObjectType(leftType) ? getIndexInfoOfType(apparentType, IndexKind.String) : undefined;
1957419574
if (!(indexInfo && indexInfo.type)) {
1957519575
if (isJSLiteralType(leftType)) {
1957619576
return anyType;

0 commit comments

Comments
 (0)