@@ -18567,7 +18567,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
18567
18567
}
18568
18568
if (everyType(objectType, isTupleType) && isNumericLiteralName(propName)) {
18569
18569
const index = +propName;
18570
- if (accessNode && everyType(objectType, t => !(t as TupleTypeReference).target.hasRestElement ) && !(accessFlags & AccessFlags.NoTupleBoundsCheck)) {
18570
+ if (accessNode && everyType(objectType, t => !(( t as TupleTypeReference).target.combinedFlags & ElementFlags.Variable) ) && !(accessFlags & AccessFlags.NoTupleBoundsCheck)) {
18571
18571
const indexNode = getIndexNodeForAccessExpression(accessNode);
18572
18572
if (isTupleType(objectType)) {
18573
18573
if (index < 0) {
@@ -25755,7 +25755,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
25755
25755
25756
25756
function tupleTypesDefinitelyUnrelated(source: TupleTypeReference, target: TupleTypeReference) {
25757
25757
return !(target.target.combinedFlags & ElementFlags.Variadic) && target.target.minLength > source.target.minLength ||
25758
- !target.target.hasRestElement && ( source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength);
25758
+ !( target.target.combinedFlags & ElementFlags.Variable) && (!!( source.target.combinedFlags & ElementFlags.Variable) || target.target.fixedLength < source.target.fixedLength);
25759
25759
}
25760
25760
25761
25761
function typesDefinitelyUnrelated(source: Type, target: Type) {
@@ -26586,7 +26586,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
26586
26586
return;
26587
26587
}
26588
26588
const startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0;
26589
- const endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, ElementFlags.Fixed) : 0, target.target.hasRestElement ? getEndElementCount(target.target, ElementFlags.Fixed) : 0);
26589
+ const endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, ElementFlags.Fixed) : 0, target.target.combinedFlags & ElementFlags.Variable ? getEndElementCount(target.target, ElementFlags.Fixed) : 0);
26590
26590
// Infer between starting fixed elements.
26591
26591
for (let i = 0; i < startLength; i++) {
26592
26592
inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
@@ -26615,7 +26615,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
26615
26615
// if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
26616
26616
const param = getInferenceInfoForType(elementTypes[startLength])?.typeParameter;
26617
26617
const constraint = param && getBaseConstraintOfType(param);
26618
- if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement ) {
26618
+ if (constraint && isTupleType(constraint) && !( constraint.target.combinedFlags & ElementFlags.Variable) ) {
26619
26619
const impliedArity = constraint.target.fixedLength;
26620
26620
inferFromTypes(sliceTupleType(source, startLength, sourceArity - (startLength + impliedArity)), elementTypes[startLength]);
26621
26621
inferFromTypes(getElementTypeOfSliceOfTupleType(source, startLength + impliedArity, endLength)!, elementTypes[startLength + 1]);
@@ -26626,7 +26626,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
26626
26626
// if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
26627
26627
const param = getInferenceInfoForType(elementTypes[startLength + 1])?.typeParameter;
26628
26628
const constraint = param && getBaseConstraintOfType(param);
26629
- if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement ) {
26629
+ if (constraint && isTupleType(constraint) && !( constraint.target.combinedFlags & ElementFlags.Variable) ) {
26630
26630
const impliedArity = constraint.target.fixedLength;
26631
26631
const endIndex = sourceArity - getEndElementCount(target.target, ElementFlags.Fixed);
26632
26632
const startIndex = endIndex - impliedArity;
@@ -31583,7 +31583,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
31583
31583
// When the length is known and the index is after all spread elements we compute the offset from the element
31584
31584
// to the end and the number of ending fixed elements in the contextual tuple type.
31585
31585
const offset = length !== undefined && (lastSpreadIndex === undefined || index > lastSpreadIndex) ? length - index : 0;
31586
- const fixedEndLength = offset > 0 && t.target.hasRestElement ? getEndElementCount(t.target, ElementFlags.Fixed) : 0;
31586
+ const fixedEndLength = offset > 0 && ( t.target.combinedFlags & ElementFlags.Variable) ? getEndElementCount(t.target, ElementFlags.Fixed) : 0;
31587
31587
// If the offset is within the ending fixed part of the contextual tuple type, return the type of the contextual
31588
31588
// tuple element.
31589
31589
if (offset > 0 && offset <= fixedEndLength) {
@@ -37367,7 +37367,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37367
37367
// otherwise would return the type 'undefined').
37368
37368
const restType = getTypeOfSymbol(signature.parameters[paramCount]);
37369
37369
const index = pos - paramCount;
37370
- if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) {
37370
+ if (!isTupleType(restType) || restType.target.combinedFlags & ElementFlags.Variable || index < restType.target.fixedLength) {
37371
37371
return getIndexedAccessType(restType, getNumberLiteralType(index));
37372
37372
}
37373
37373
}
@@ -37416,7 +37416,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37416
37416
if (signatureHasRestParameter(signature)) {
37417
37417
const restType = getTypeOfSymbol(signature.parameters[length - 1]);
37418
37418
if (isTupleType(restType)) {
37419
- return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1);
37419
+ return length + restType.target.fixedLength - (restType.target.combinedFlags & ElementFlags.Variable ? 0 : 1);
37420
37420
}
37421
37421
}
37422
37422
return length;
@@ -37461,7 +37461,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37461
37461
function hasEffectiveRestParameter(signature: Signature) {
37462
37462
if (signatureHasRestParameter(signature)) {
37463
37463
const restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
37464
- return !isTupleType(restType) || restType.target.hasRestElement ;
37464
+ return !isTupleType(restType) || !!( restType.target.combinedFlags & ElementFlags.Variable) ;
37465
37465
}
37466
37466
return false;
37467
37467
}
@@ -37472,7 +37472,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
37472
37472
if (!isTupleType(restType)) {
37473
37473
return isTypeAny(restType) ? anyArrayType : restType;
37474
37474
}
37475
- if (restType.target.hasRestElement ) {
37475
+ if (restType.target.combinedFlags & ElementFlags.Variable ) {
37476
37476
return sliceTupleType(restType, restType.target.fixedLength);
37477
37477
}
37478
37478
}
@@ -40147,7 +40147,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
40147
40147
checkExpressionWithContextualType(initializer, contextualType, /*inferenceContext*/ undefined, checkMode || CheckMode.Normal)
40148
40148
: checkExpressionCached(initializer, checkMode));
40149
40149
return isParameter(declaration) && declaration.name.kind === SyntaxKind.ArrayBindingPattern &&
40150
- isTupleType(type) && !type.target.hasRestElement && getTypeReferenceArity(type) < declaration.name.elements.length ?
40150
+ isTupleType(type) && !( type.target.combinedFlags & ElementFlags.Variable) && getTypeReferenceArity(type) < declaration.name.elements.length ?
40151
40151
padTupleType(type, declaration.name) : type;
40152
40152
}
40153
40153
0 commit comments