Skip to content

Commit c2d0aa8

Browse files
committed
Only defer aliased array and tuple types
1 parent b18c70f commit c2d0aa8

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

src/compiler/checker.ts

+30-5
Original file line numberDiff line numberDiff line change
@@ -9614,15 +9614,40 @@ namespace ts {
96149614
return getTupleTypeOfArity(node.elementTypes.length, minLength, !!restElement, readonly, /*associatedNames*/ undefined);
96159615
}
96169616

9617+
function isAliasedType(node: Node): boolean {
9618+
const parent = node.parent;
9619+
switch (parent.kind) {
9620+
case SyntaxKind.ParenthesizedType:
9621+
case SyntaxKind.ArrayType:
9622+
case SyntaxKind.TupleType:
9623+
case SyntaxKind.RestType:
9624+
case SyntaxKind.UnionType:
9625+
case SyntaxKind.IntersectionType:
9626+
case SyntaxKind.IndexedAccessType:
9627+
return isAliasedType(parent);
9628+
case SyntaxKind.TypeAliasDeclaration:
9629+
return true;
9630+
}
9631+
return false;
9632+
}
9633+
96179634
function getTypeFromArrayOrTupleTypeNode(node: ArrayTypeNode | TupleTypeNode): Type {
96189635
const links = getNodeLinks(node);
96199636
if (!links.resolvedType) {
96209637
const target = getArrayOrTupleTargetType(node);
9621-
const aliasSymbol = getAliasSymbolForTypeNode(node);
9622-
const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
9623-
links.resolvedType = target === emptyGenericType ? emptyObjectType :
9624-
node.kind === SyntaxKind.TupleType && node.elementTypes.length === 0 ? target :
9625-
createDeferredTypeReference(target, node, /*mapper*/ undefined, aliasSymbol, aliasTypeArguments);
9638+
if (target === emptyGenericType) {
9639+
links.resolvedType = emptyObjectType;
9640+
}
9641+
else if (isAliasedType(node)) {
9642+
const aliasSymbol = getAliasSymbolForTypeNode(node);
9643+
const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
9644+
links.resolvedType = node.kind === SyntaxKind.TupleType && node.elementTypes.length === 0 ? target :
9645+
createDeferredTypeReference(target, node, /*mapper*/ undefined, aliasSymbol, aliasTypeArguments);
9646+
}
9647+
else {
9648+
const elementTypes = node.kind === SyntaxKind.ArrayType ? [getTypeFromTypeNode(node.elementType)] : map(node.elementTypes, getTypeFromTypeNode);
9649+
links.resolvedType = createTypeReference(target, elementTypes);
9650+
}
96269651
}
96279652
return links.resolvedType;
96289653
}

0 commit comments

Comments
 (0)