Skip to content

Commit 1355729

Browse files
committed
Consistent widening in property and element access expressions
1 parent 3139cf2 commit 1355729

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

src/compiler/checker.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20217,19 +20217,25 @@ namespace ts {
2021720217
return checkPropertyAccessExpressionOrQualifiedName(node, node.left, node.right);
2021820218
}
2021920219

20220+
function isMethodAccessForCall(node: Node) {
20221+
while (node.parent.kind === SyntaxKind.ParenthesizedExpression) {
20222+
node = node.parent;
20223+
}
20224+
return isCallOrNewExpression(node.parent) && node.parent.expression === node;
20225+
}
20226+
2022020227
function checkPropertyAccessExpressionOrQualifiedName(node: PropertyAccessExpression | QualifiedName, left: Expression | QualifiedName, right: Identifier) {
2022120228
let propType: Type;
2022220229
const leftType = checkNonNullExpression(left);
2022320230
const parentSymbol = getNodeLinks(left).resolvedSymbol;
20224-
// We widen array literals to get type any[] instead of undefined[] in non-strict mode
20225-
const apparentType = getApparentType(isEmptyArrayLiteralType(leftType) ? getWidenedType(leftType) : leftType);
20231+
const assignmentKind = getAssignmentTargetKind(node);
20232+
const apparentType = getApparentType(assignmentKind !== AssignmentKind.None || isMethodAccessForCall(node) ? getWidenedType(leftType) : leftType);
2022620233
if (isTypeAny(apparentType) || apparentType === silentNeverType) {
2022720234
if (isIdentifier(left) && parentSymbol) {
2022820235
markAliasReferenced(parentSymbol, node);
2022920236
}
2023020237
return apparentType;
2023120238
}
20232-
const assignmentKind = getAssignmentTargetKind(node);
2023320239
const prop = getPropertyOfType(apparentType, right.escapedText);
2023420240
if (isIdentifier(left) && parentSymbol && !(prop && isConstEnumOrConstEnumOnlyModule(prop))) {
2023520241
markAliasReferenced(parentSymbol, node);
@@ -20623,7 +20629,8 @@ namespace ts {
2062320629
}
2062420630

2062520631
function checkIndexedAccess(node: ElementAccessExpression): Type {
20626-
const objectType = checkNonNullExpression(node.expression);
20632+
const exprType = checkNonNullExpression(node.expression);
20633+
const objectType = getAssignmentTargetKind(node) !== AssignmentKind.None || isMethodAccessForCall(node.parent) ? getWidenedType(exprType) : exprType;
2062720634

2062820635
const indexExpression = node.argumentExpression;
2062920636
if (!indexExpression) {

0 commit comments

Comments
 (0)