@@ -29665,15 +29665,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
29665
29665
29666
29666
function isConstraintPosition(type: Type, node: Node) {
29667
29667
const parent = node.parent;
29668
- // In an element access obj[x ], we consider obj to be in a constraint position, except when obj is of
29669
- // a generic type without a nullable constraint and x is a generic type. This is because when both obj
29670
- // and x are of generic types T and K, we want the resulting type to be T[K].
29668
+ // In an element access obj[key ], we consider obj to be in a constraint position, except when
29669
+ // obj and key both have generic types. When obj and key are of generic types T and K, we want
29670
+ // the resulting type to be T[K].
29671
29671
return parent.kind === SyntaxKind.PropertyAccessExpression ||
29672
29672
parent.kind === SyntaxKind.QualifiedName ||
29673
29673
parent.kind === SyntaxKind.CallExpression && (parent as CallExpression).expression === node ||
29674
29674
parent.kind === SyntaxKind.NewExpression && (parent as NewExpression).expression === node ||
29675
29675
parent.kind === SyntaxKind.ElementAccessExpression && (parent as ElementAccessExpression).expression === node &&
29676
- !(someType (type, isGenericTypeWithoutNullableConstraint ) && isGenericIndexType(getTypeOfExpression((parent as ElementAccessExpression).argumentExpression)));
29676
+ !(isGenericObjectType (type) && isGenericIndexType(getTypeOfExpression((parent as ElementAccessExpression).argumentExpression)));
29677
29677
}
29678
29678
29679
29679
function isGenericTypeWithUnionConstraint(type: Type): boolean {
@@ -29682,12 +29682,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
29682
29682
!!(type.flags & TypeFlags.Instantiable && getBaseConstraintOrType(type).flags & (TypeFlags.Nullable | TypeFlags.Union));
29683
29683
}
29684
29684
29685
- function isGenericTypeWithoutNullableConstraint(type: Type): boolean {
29686
- return type.flags & TypeFlags.Intersection ?
29687
- some((type as IntersectionType).types, isGenericTypeWithoutNullableConstraint) :
29688
- !!(type.flags & TypeFlags.Instantiable && !maybeTypeOfKind(getBaseConstraintOrType(type), TypeFlags.Nullable));
29689
- }
29690
-
29691
29685
function hasContextualTypeWithNoGenericTypes(node: Node, checkMode: CheckMode | undefined) {
29692
29686
// Computing the contextual type for a child of a JSX element involves resolving the type of the
29693
29687
// element's tag name, so we exclude that here to avoid circularities.
@@ -34589,14 +34583,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
34589
34583
}
34590
34584
34591
34585
function checkIndexedAccess(node: ElementAccessExpression, checkMode: CheckMode | undefined): Type {
34592
- return node.flags & NodeFlags.OptionalChain ? checkElementAccessChain(node as ElementAccessChain, checkMode) :
34593
- checkElementAccessExpression(node, checkNonNullExpression(node.expression), checkMode);
34594
- }
34595
-
34596
- function checkElementAccessChain(node: ElementAccessChain, checkMode: CheckMode | undefined) {
34586
+ const isOptional = node.flags & NodeFlags.OptionalChain;
34597
34587
const exprType = checkExpression(node.expression);
34598
- const nonOptionalType = getOptionalExpressionType(exprType, node.expression);
34599
- return propagateOptionalTypeMarker(checkElementAccessExpression(node, checkNonNullType(nonOptionalType, node.expression), checkMode), node, nonOptionalType !== exprType);
34588
+ const nonOptionalType = isOptional ? getOptionalExpressionType(exprType, node.expression) : exprType;
34589
+ const nonNullType = maybeTypeOfKind(nonOptionalType, TypeFlags.Unknown | TypeFlags.Nullable) ? checkNonNullType(nonOptionalType, node.expression) : nonOptionalType;
34590
+ const elementType = checkElementAccessExpression(node, nonNullType, checkMode);
34591
+ return isOptional ? propagateOptionalTypeMarker(elementType, node as ElementAccessChain, nonOptionalType !== exprType) : elementType;
34600
34592
}
34601
34593
34602
34594
function checkElementAccessExpression(node: ElementAccessExpression, exprType: Type, checkMode: CheckMode | undefined): Type {
0 commit comments