@@ -9581,13 +9581,25 @@ namespace ts {
9581
9581
return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]);
9582
9582
}
9583
9583
9584
- function getTypeFromArrayTypeNode(node: ArrayTypeNode): Type {
9584
+ function getArrayOrTupleTargetType(node: ArrayTypeNode | TupleTypeNode): GenericType {
9585
+ const readonly = isReadonlyTypeOperator(node.parent);
9586
+ if (node.kind === SyntaxKind.ArrayType || node.elementTypes.length === 1 && node.elementTypes[0].kind === SyntaxKind.RestType) {
9587
+ return readonly ? globalReadonlyArrayType : globalArrayType;
9588
+ }
9589
+ const lastElement = lastOrUndefined(node.elementTypes);
9590
+ const restElement = lastElement && lastElement.kind === SyntaxKind.RestType ? lastElement : undefined;
9591
+ const minLength = findLastIndex(node.elementTypes, n => n.kind !== SyntaxKind.OptionalType && n !== restElement) + 1;
9592
+ return getTupleTypeOfArity(node.elementTypes.length, minLength, !!restElement, readonly, /*associatedNames*/ undefined);
9593
+ }
9594
+
9595
+ function getTypeFromArrayOrTupleTypeNode(node: ArrayTypeNode | TupleTypeNode): Type {
9585
9596
const links = getNodeLinks(node);
9586
9597
if (!links.resolvedType) {
9587
- const target = isReadonlyTypeOperator (node.parent) ? globalReadonlyArrayType : globalArrayType ;
9598
+ const target = getArrayOrTupleTargetType (node) ;
9588
9599
const aliasSymbol = getAliasSymbolForTypeNode(node);
9589
9600
const aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
9590
- links.resolvedType = createDeferredTypeReference(target, [node.elementType], /*mapper*/ undefined, aliasSymbol, aliasTypeArguments);
9601
+ const elementTypes = node.kind === SyntaxKind.ArrayType ? [node.elementType] : node.elementTypes;
9602
+ links.resolvedType = elementTypes.length ? createDeferredTypeReference(target, elementTypes, /*mapper*/ undefined, aliasSymbol, aliasTypeArguments) : target;
9591
9603
}
9592
9604
return links.resolvedType;
9593
9605
}
@@ -9665,21 +9677,6 @@ namespace ts {
9665
9677
return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType;
9666
9678
}
9667
9679
9668
- function getTypeFromTupleTypeNode(node: TupleTypeNode): Type {
9669
- const links = getNodeLinks(node);
9670
- if (!links.resolvedType) {
9671
- const lastElement = lastOrUndefined(node.elementTypes);
9672
- const restElement = lastElement && lastElement.kind === SyntaxKind.RestType ? lastElement : undefined;
9673
- const minLength = findLastIndex(node.elementTypes, n => n.kind !== SyntaxKind.OptionalType && n !== restElement) + 1;
9674
- const elementTypes = map(node.elementTypes, n => {
9675
- const type = getTypeFromTypeNode(n);
9676
- return n === restElement && getIndexTypeOfType(type, IndexKind.Number) || type;
9677
- });
9678
- links.resolvedType = createTupleType(elementTypes, minLength, !!restElement, isReadonlyTypeOperator(node.parent));
9679
- }
9680
- return links.resolvedType;
9681
- }
9682
-
9683
9680
function sliceTupleType(type: TupleTypeReference, index: number) {
9684
9681
const tuple = type.target;
9685
9682
if (tuple.hasRestElement) {
@@ -11169,9 +11166,8 @@ namespace ts {
11169
11166
case SyntaxKind.TypeQuery:
11170
11167
return getTypeFromTypeQueryNode(<TypeQueryNode>node);
11171
11168
case SyntaxKind.ArrayType:
11172
- return getTypeFromArrayTypeNode(<ArrayTypeNode>node);
11173
11169
case SyntaxKind.TupleType:
11174
- return getTypeFromTupleTypeNode(< TupleTypeNode>node);
11170
+ return getTypeFromArrayOrTupleTypeNode(<ArrayTypeNode | TupleTypeNode>node);
11175
11171
case SyntaxKind.OptionalType:
11176
11172
return getTypeFromOptionalTypeNode(<OptionalTypeNode>node);
11177
11173
case SyntaxKind.UnionType:
@@ -11183,10 +11179,11 @@ namespace ts {
11183
11179
case SyntaxKind.JSDocOptionalType:
11184
11180
return addOptionality(getTypeFromTypeNode((node as JSDocOptionalType).type));
11185
11181
case SyntaxKind.ParenthesizedType:
11186
- case SyntaxKind.RestType:
11187
11182
case SyntaxKind.JSDocNonNullableType:
11188
11183
case SyntaxKind.JSDocTypeExpression:
11189
- return getTypeFromTypeNode((<ParenthesizedTypeNode | RestTypeNode | JSDocTypeReferencingNode | JSDocTypeExpression>node).type);
11184
+ return getTypeFromTypeNode((<ParenthesizedTypeNode | JSDocTypeReferencingNode | JSDocTypeExpression>node).type);
11185
+ case SyntaxKind.RestType:
11186
+ return getElementTypeOfArrayType(getTypeFromTypeNode((<RestTypeNode>node).type)) || errorType;
11190
11187
case SyntaxKind.JSDocVariadicType:
11191
11188
return getTypeFromJSDocVariadicType(node as JSDocVariadicType);
11192
11189
case SyntaxKind.FunctionType:
@@ -11644,19 +11641,15 @@ namespace ts {
11644
11641
return getAnonymousTypeInstantiation(<AnonymousType>type, mapper);
11645
11642
}
11646
11643
if (objectFlags & ObjectFlags.Reference) {
11647
- const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
11648
- if (resolvedTypeArguments) {
11649
- const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
11650
- return newTypeArguments !== resolvedTypeArguments ? createTypeReference((<TypeReference>type).target, newTypeArguments) : type;
11651
- }
11652
- else {
11653
- const typeArgumentNodes = (<TypeReference>type).typeArgumentNodes;
11654
- if (typeArgumentNodes) {
11655
- const combinedMapper = combineTypeMappers((<TypeReference>type).mapper, mapper);
11656
- return createDeferredTypeReference((<TypeReference>type).target, typeArgumentNodes, combinedMapper,
11657
- (<TypeReference>type).aliasSymbol, instantiateTypes((<TypeReference>type).aliasTypeArguments, combinedMapper));
11658
- }
11644
+ const typeArgumentNodes = (<TypeReference>type).typeArgumentNodes;
11645
+ if (typeArgumentNodes) {
11646
+ const combinedMapper = combineTypeMappers((<TypeReference>type).mapper, mapper);
11647
+ return createDeferredTypeReference((<TypeReference>type).target, typeArgumentNodes, combinedMapper,
11648
+ (<TypeReference>type).aliasSymbol, instantiateTypes((<TypeReference>type).aliasTypeArguments, combinedMapper));
11659
11649
}
11650
+ const resolvedTypeArguments = (<TypeReference>type).resolvedTypeArguments;
11651
+ const newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
11652
+ return newTypeArguments !== resolvedTypeArguments ? createTypeReference((<TypeReference>type).target, newTypeArguments) : type;
11660
11653
}
11661
11654
return type;
11662
11655
}
@@ -14446,8 +14439,12 @@ namespace ts {
14446
14439
return type.flags & TypeFlags.TypeParameter && !getConstraintOfTypeParameter(<TypeParameter>type);
14447
14440
}
14448
14441
14442
+ function isNonDeferredTypeReference(type: Type): type is TypeReference {
14443
+ return !!(getObjectFlags(type) & ObjectFlags.Reference) && !(<TypeReference>type).typeArgumentNodes;
14444
+ }
14445
+
14449
14446
function isTypeReferenceWithGenericArguments(type: Type): boolean {
14450
- return !!(getObjectFlags( type) & ObjectFlags.Reference) && some(getTypeArguments(<TypeReference> type), t => isUnconstrainedTypeParameter(t) || isTypeReferenceWithGenericArguments(t));
14447
+ return isNonDeferredTypeReference( type) && some(getTypeArguments(type), t => isUnconstrainedTypeParameter(t) || isTypeReferenceWithGenericArguments(t));
14451
14448
}
14452
14449
14453
14450
/**
@@ -26090,7 +26087,7 @@ namespace ts {
26090
26087
grammarErrorOnNode(e, Diagnostics.A_rest_element_must_be_last_in_a_tuple_type);
26091
26088
break;
26092
26089
}
26093
- if (!isArrayType(getTypeFromTypeNode(e ))) {
26090
+ if (!isArrayType(getTypeFromTypeNode((<RestTypeNode>e).type ))) {
26094
26091
error(e, Diagnostics.A_rest_element_type_must_be_an_array_type);
26095
26092
}
26096
26093
}
0 commit comments