mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-15 12:51:30 -05:00
Consistent widening in property and element access expressions
This commit is contained in:
@@ -20217,19 +20217,25 @@ namespace ts {
|
||||
return checkPropertyAccessExpressionOrQualifiedName(node, node.left, node.right);
|
||||
}
|
||||
|
||||
function isMethodAccessForCall(node: Node) {
|
||||
while (node.parent.kind === SyntaxKind.ParenthesizedExpression) {
|
||||
node = node.parent;
|
||||
}
|
||||
return isCallOrNewExpression(node.parent) && node.parent.expression === node;
|
||||
}
|
||||
|
||||
function checkPropertyAccessExpressionOrQualifiedName(node: PropertyAccessExpression | QualifiedName, left: Expression | QualifiedName, right: Identifier) {
|
||||
let propType: Type;
|
||||
const leftType = checkNonNullExpression(left);
|
||||
const parentSymbol = getNodeLinks(left).resolvedSymbol;
|
||||
// We widen array literals to get type any[] instead of undefined[] in non-strict mode
|
||||
const apparentType = getApparentType(isEmptyArrayLiteralType(leftType) ? getWidenedType(leftType) : leftType);
|
||||
const assignmentKind = getAssignmentTargetKind(node);
|
||||
const apparentType = getApparentType(assignmentKind !== AssignmentKind.None || isMethodAccessForCall(node) ? getWidenedType(leftType) : leftType);
|
||||
if (isTypeAny(apparentType) || apparentType === silentNeverType) {
|
||||
if (isIdentifier(left) && parentSymbol) {
|
||||
markAliasReferenced(parentSymbol, node);
|
||||
}
|
||||
return apparentType;
|
||||
}
|
||||
const assignmentKind = getAssignmentTargetKind(node);
|
||||
const prop = getPropertyOfType(apparentType, right.escapedText);
|
||||
if (isIdentifier(left) && parentSymbol && !(prop && isConstEnumOrConstEnumOnlyModule(prop))) {
|
||||
markAliasReferenced(parentSymbol, node);
|
||||
@@ -20623,7 +20629,8 @@ namespace ts {
|
||||
}
|
||||
|
||||
function checkIndexedAccess(node: ElementAccessExpression): Type {
|
||||
const objectType = checkNonNullExpression(node.expression);
|
||||
const exprType = checkNonNullExpression(node.expression);
|
||||
const objectType = getAssignmentTargetKind(node) !== AssignmentKind.None || isMethodAccessForCall(node.parent) ? getWidenedType(exprType) : exprType;
|
||||
|
||||
const indexExpression = node.argumentExpression;
|
||||
if (!indexExpression) {
|
||||
|
||||
Reference in New Issue
Block a user